Как сравнить даты в Java?

Как сравнить даты между Java?

Пример:

date1 22-02-2010
 date2 07-04-2010 сегодня
 date3 - 25-12-2010

date3 всегда больше, чем date1, а date2 всегда сегодня. Как проверить, находится ли сегодня дата между датой 1 и датой 3?

Ответ 1

Date имеет before и after и может быть по сравнению друг с другом следующим образом

if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
    // In between
}

Для инклюзивного сравнения:

if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
    /* historyDate <= todayDate <= futureDate */ 
}

Вы также можете дать Joda-Time a, но обратите внимание, что:

Joda-Time - фактическая стандартная библиотека даты и времени для Java до Java SE 8. Теперь пользователям предлагается перейти на java.time (JSR-310).

Back-ports доступны для Java 6 и 7, а также для Android.

Ответ 2

Используйте compareTo:

date1.compareTo(date2);

Ответ 3

Ниже приведены наиболее распространенные способы сравнения дат. Но я предпочитаю сначала

Подход-1: использование Date.before(), Date.after() и Date.equals()

            if(date1.after(date2)){
                System.out.println("Date1 is after Date2");
            }

            if(date1.before(date2)){
                System.out.println("Date1 is before Date2");
            }

            if(date1.equals(date2)){
                System.out.println("Date1 is equal Date2");
            }

Подход-2: Date.compareTo()

           if(date1.compareTo(date2)>0){
                System.out.println("Date1 is after Date2");
            }else if(date1.compareTo(date2)<0){
                System.out.println("Date1 is before Date2");
            }else{
                System.out.println("Date1 is equal to Date2");
            }

Подход-3: Calender.before(), Calender.after() и Calender.equals()

Calendar cal1 = Calendar.getInstance();
            Calendar cal2 = Calendar.getInstance();
            cal1.setTime(date1);
            cal2.setTime(date2);

            if(cal1.after(cal2)){
                System.out.println("Date1 is after Date2");
            }

            if(cal1.before(cal2)){
                System.out.println("Date1 is before Date2");
            }

            if(cal1.equals(cal2)){
                System.out.println("Date1 is equal Date2");
            }

Ответ 4

ТЛ; др

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean isBetween = 
    ( ! today.isBefore( localDate1 ) )  // "not-before" is short for "is-equal-to or later-than".
    &&
    today.isBefore( localDate3 ) ; 

Или, лучше, если вы добавите в проект проект библиотеки ThreeTen-Extra.

LocalDateRange.of(
    LocalDate.of( … ) ,
    LocalDate.of( … )
).contains(
    LocalDate.now()
)

Полуоткрытый подход, где начало включено, а окончание - исключительно.

Плохой выбор формата

Кстати, это плохой выбор формата для текстового представления даты или даты-времени. По возможности придерживайтесь стандартных форматов ISO 8601. Форматы ISO 8601 недвусмысленны, понятны в культурах людей и легко анализируются машиной.

Для значения только для даты стандартным форматом является YYYY-MM-DD. Обратите внимание, что этот формат имеет преимущество хронологического при сортировке по алфавиту.

LocalDate

Класс LocalDate представляет значение даты только без времени и без часового пояса.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париже Франция - новый день, еще "вчера" в Монреале Квебек.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

Поскольку ваши строки ввода нестандартного формата, мы должны определить шаблон форматирования для соответствия.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );

Используйте это для синтаксического анализа входных строк.

LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );

В работе с датой времени обычно лучше всего определить промежуток времени по принципу Half-Open, где начало включено, в то время как окончание является исключительным. Поэтому мы хотим знать, является ли сегодня то же самое или позже начала, а также до остановки. Более короткий способ сказать "тот же или позже начала" "не раньше начала".

Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;

См. fooobar.com/questions/29/... показывающий список методов сравнения, которые вы можете вызвать.


О java.time

Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.

Где можно получить классы java.time?

  • Java SE 8 и SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и другие.


ОБНОВЛЕНИЕ: этот раздел "Joda-Time" ниже остается неизменным как история. Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.

Joda времени

Другие ответы правильны в отношении связанных классов java.util.Date и java.util.Calendar. Но эти классы, как известно, хлопотны. Итак, вот пример кода с использованием библиотеки Joda-Time 2.3.

Если вы действительно хотите дату без какого - либо временного отрезка и без часового пояса, а затем использовать LocalDate класс в Joda-Time. Этот класс предоставляет методы сравнения, включая compareTo (используется с Java Comparators), isBefore, isAfter и isEqual.

Входы...

String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";

Определите форматтер, описывающий входные строки...

DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );

Используйте formatter для синтаксического анализа строк в объектах LocalDate...

LocalDate localDate1 = formatter.parseLocalDate( string1 );
LocalDate localDate2 = formatter.parseLocalDate( string2 );
LocalDate localDate3 = formatter.parseLocalDate( string3 );

boolean is1After2 = localDate1.isAfter( localDate2 );
boolean is2Before3 = localDate2.isBefore( localDate3 );

Сбросить консоль...

System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );

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

Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true

Поэтому посмотрите, находится ли вторая между двумя другими (исключительно, что означает не равную конечной точке)...

boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );

Работа с промежутками времени

Если вы работаете с промежутками времени, я предлагаю исследовать в Joda-Time классы: продолжительность, интервал и период. Методы, такие как overlap и contains простые сравнения.

Для текстовых представлений ознакомьтесь со стандартами ISO 8601:

  • продолжительность
    Формат: PnYnMnDTnHnMnS
    Пример: P3Y6M4DT12H30M5S
    (Означает "три года, шесть месяцев, четыре дня, двенадцать часов, тридцать минут и пять секунд")
  • интервал
    Формат: начало/конец
    Пример: 2007-03-01T13: 00: 00Z/2008-05-11T15: 30: 00Z

Классы Joda-Time могут работать со строками в обоих форматах, как в качестве входных (синтаксический анализ), так и вывода (генерации строк).

Joda-Time выполняет сравнения с использованием подхода Half-Open, где начало диапазона включено, в то время как окончание является эксклюзивным. Этот подход является разумным для обработки промежутков времени. Найдите StackOverflow для получения дополнительной информации.

Ответ 5

Сравните две даты:

  Date today = new Date();                   
  Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay());
  System.out.println("My Date is"+myDate);    
  System.out.println("Today Date is"+today);
  if (today.compareTo(myDate)<0)
      System.out.println("Today Date is Lesser than my Date");
  else if (today.compareTo(myDate)>0)
      System.out.println("Today Date is Greater than my date"); 
  else
      System.out.println("Both Dates are equal"); 

Ответ 6

Обновление для Java 8 и более поздних версий

Эти методы существуют в LocalDate, LocalTime и LocalDateTime.

Эти классы встроены в Java 8 и более поздние версии. Большая часть функциональности java.time портирована на Java 6 и 7 в ThreeTen-Backport и далее адаптирована к Android в ThreeTenABP (см. Как использовать...).

Ответ 7

Вы можете использовать Date.getTime(), который:

Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу. представленный этим объектом Date.

Это означает, что вы можете сравнивать их точно так же, как цифры:

if (date1.getTime() <= date.getTime() && date.getTime() <= date2.getTime()) {
    /*
     * date is between date1 and date2 (both inclusive)
     */
}

/*
 * when date1 = 2015-01-01 and date2 = 2015-01-10 then
 * returns true for:
 * 2015-01-01
 * 2015-01-01 00:00:01
 * 2015-01-02
 * 2015-01-10
 * returns false for:
 * 2014-12-31 23:59:59
 * 2015-01-10 00:00:01
 * 
 * if one or both dates are exclusive then change <= to <
 */

Ответ 8

Используйте getTime(), чтобы получить числовое значение даты, а затем сравните с помощью возвращаемых значений.

Ответ 9

Попробуйте это

public static boolean compareDates(String psDate1, String psDate2) throws ParseException{
        SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy");
        Date date1 = dateFormat.parse(psDate1);
        Date date2 = dateFormat.parse(psDate2);
        if(date2.after(date1)) {
            return true;
        } else {
            return false;
        }
    }

Ответ 10

Этот код определяет сегодня в некоторой продолжительности.. на основе локали KOREA

    Calendar cstart = Calendar.getInstance(Locale.KOREA);
    cstart.clear();
    cstart.set(startyear, startmonth, startday);


    Calendar cend = Calendar.getInstance(Locale.KOREA);
    cend.clear();
    cend.set(endyear, endmonth, endday);

    Calendar c = Calendar.getInstance(Locale.KOREA);

    if(c.after(cstart) && c.before(cend)) {
        // today is in startyear/startmonth/startday ~ endyear/endmonth/endday
    }

Ответ 11

Этот метод работал у меня:

 public static String daysBetween(String day1, String day2) {
    String daysBetween = "";
    SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {
        Date date1 = myFormat.parse(day1);
        Date date2 = myFormat.parse(day2);
        long diff = date2.getTime() - date1.getTime();
        daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return daysBetween;
}