Как я могу определить, является ли дата между двумя датами в Java?

голоса
77

Как я могу проверить , если дата находится между двумя другими датами, в том случае , когда все три даты представлены экземплярами java.util.Date?

Задан 19/05/2009 в 13:17
источник пользователем
На других языках...                            


11 ответов

голоса
37

Вот так:

Date min, max;   // assume these are set to something
Date d;          // the date in question

return d.compareTo(min) >= 0 && d.compareTo(max) <= 0;

Вы можете использовать >вместо >=и <вместо того , <=чтобы исключить конечные точки от чувства «между ними.»

Ответил 19/05/2009 в 13:19
источник пользователем

голоса
216

Это может быть немного более удобным для чтения:

Date min, max;   // assume these are set to something
Date d;          // the date in question

return d.after(min) && d.before(max);
Ответил 19/05/2009 в 13:22
источник пользователем

голоса
2

Вы можете использовать getTime()и сравнить полученные значения длинных UTC.

EDIT, если вы уверены, что вы не будете иметь дело с датами до 1970 года, не знаю, как он будет вести себя в этом случае.

Ответил 19/05/2009 в 13:33
источник пользователем

голоса
8

Другой вариант

min.getTime() <= d.getTime() && d.getTime() <= max.getTime()
Ответил 19/05/2009 в 13:37
источник пользователем

голоса
2

Вы можете захотеть взглянуть на Joda время , которое действительно хороший API для работы с датой / временем. Несмотря на то, если вы на самом деле не нужны для решения текущего вопроса он обязан спасти вас боль в будущем.

Ответил 19/05/2009 в 13:38
источник пользователем

голоса
93

Если вы не знаете, порядок мин / макс значений

Date a, b;   // assume these are set to something
Date d;      // the date in question

return a.compareTo(d) * d.compareTo(b) > 0;

Если вы хотите диапазон быть включен

return a.compareTo(d) * d.compareTo(b) >= 0;
Ответил 19/05/2009 в 18:28
источник пользователем

голоса
2
import java.util.Date;

public class IsDateBetween {

public static void main (String[] args) {

          IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date
 }
 public IsDateBetween(String dd) {

       long  from=Date.parse("01/01/2000");  // From some date

       long to=Date.parse("12/12/2010");     // To Some Date

       long check=Date.parse(dd);

       int x=0;

      if((check-from)>0 && (to-check)>0)
      {
             x=1;
      }

 System.out.println ("From Date is greater Than  ToDate : "+x);
}   

}
Ответил 13/08/2010 в 00:40
источник пользователем

голоса
1

Ну вот:

public static void main(String[] args) throws ParseException {

        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

        String oeStartDateStr = "04/01/";
        String oeEndDateStr = "11/14/";

        Calendar cal = Calendar.getInstance();
        Integer year = cal.get(Calendar.YEAR);

        oeStartDateStr = oeStartDateStr.concat(year.toString());
        oeEndDateStr = oeEndDateStr.concat(year.toString());

        Date startDate = sdf.parse(oeStartDateStr);
        Date endDate = sdf.parse(oeEndDateStr);
        Date d = new Date();
        String currDt = sdf.format(d);


        if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){
            System.out.println("Date is between 1st april to 14th nov...");
        }
        else{
            System.out.println("Date is not between 1st april to 14th nov...");
        }
    }
Ответил 29/01/2014 в 09:15
источник пользователем

голоса
11

Вот несколько способов сделать это с помощью Joda-Time 2.3 библиотеки.

Один из способов заключается в использовании простой isBeforeи isAfterметодов на DateTime экземпляров. Кстати, DateTime в Joda-Time аналогична концепции к java.util.Date (в момент времени на временной шкале Вселенной) , но включает в себя временную зону.

Другой способ заключается в создании интервала в Joda-Time. В containsметоде испытание , если данный DateTime происходит в течение промежутка времени , охватываемый интервал. Начало интервала является включительно, но конечной точкой является эксклюзивной. Этот подход известен как «Half-Open», символически [).

См оба пути в следующем примере кода.

Преобразование экземпляров java.util.Date в Joda-Time DateTimeэкземпляров. Просто передайте экземпляр Date в конструкторе DateTime. На практике вы также должны пройти определенный DateTimeZoneобъект , а не полагаться на часовой пояс JVM по умолчанию.

DateTime dateTime1 = new DateTime( new java.util.Date() ).minusWeeks( 1 );
DateTime dateTime2 = new DateTime( new java.util.Date() );
DateTime dateTime3 = new DateTime( new java.util.Date() ).plusWeeks( 1 );

Сравните путем тестирования до / после ...

boolean is1After2 = dateTime1.isAfter( dateTime2 );
boolean is2Before3 = dateTime2.isBefore( dateTime3 );

boolean is2Between1And3 = ( ( dateTime2.isAfter( dateTime1 ) ) && ( dateTime2.isBefore( dateTime3 ) ) );

Использование интервального подхода вместо isAfter / isBefore ...

Interval interval = new Interval( dateTime1, dateTime3 );
boolean intervalContainsDateTime2 = interval.contains( dateTime2 );

Свалка утешать ...

System.out.println( "DateTimes: " + dateTime1 + " " + dateTime1 + " " + dateTime1 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );
System.out.println( "is2Between1And3 " + is2Between1And3 );
System.out.println( "intervalContainsDateTime2 " + intervalContainsDateTime2 );

При запуске ...

DateTimes: 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00
is1After2 false
is2Before3 true
is2Between1And3 true
intervalContainsDateTime2 true
Ответил 31/01/2014 в 05:27
источник пользователем

голоса
2

Вот как найти ли сегодня между 2-х месяцев:

private boolean isTodayBetween(int from, int to) {
    if (from < 0 || to < 0 || from > Calendar.DECEMBER || to > Calendar.DECEMBER) {
        throw new IllegalArgumentException("Invalid month provided: from = " + from + " to = " + to);
    }
    Date now = new Date();
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(now);
    int thisMonth = cal.get(Calendar.MONTH);
    if (from > to) {
        to = to + Calendar.DECEMBER;
        thisMonth = thisMonth + Calendar.DECEMBER;
    }
    if (thisMonth >= from && thisMonth <= to) {
        return true;
    }
    return false;
}

и назвать его как:

isTodayBetween(Calendar.OCTOBER, Calendar.MARCH)
Ответил 14/04/2015 в 06:46
источник пользователем

голоса
4

Между датами, включая конечные точки можно записать в виде

public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){
    return !(date.before(min) || date.after(max));
}
Ответил 09/02/2016 в 05:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more