Сравнение двух дат на Java

Научитесь сравнивать две заданные даты в Java, чтобы узнать, какая дата раньше, а какая позже в универсальной временной шкале. Мы увидим примеры сравнения дат с использованием следующих классов:

  • Классы LocalDate, LocalDateTime и ZonedDateTime из Java 8
  • Дата и календарь(до Java 7)

1. Сравнение дат с Java 8

1.1 Основные классы

Наиболее используемые классы дат в Java 8:

  • java.time.LocalDate – только дата, без времени и часового пояса.
  • java.time.LocalDateTime – Только дата и время, без часового пояса
  • java.time.ZonedDateTime – Дата и время с часовым поясом.
  • java.time.Instant – секунды, прошедшие с начала эпохи(полночь 1 января 1970 года по всемирному координированному времени)

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

Все вышеперечисленные классы имеют методы для сравнения двух экземпляров самих себя, то есть isAfter(), isBefore(), isEqual() и compareTo().

  • date1.isAfter( date2 ) – возвращает true, если date1 следует после date2; в противном случае false.
  • date1.isBefore( date2 ) – возвращает true, если date1 предшествует date2; в противном случае false.
  • date1.isEqual( date2 ) – возвращает true, если date1 равна date2; в противном случае false.
  • date1.compareTo( date2 ) – Возвращает 'положительное число', если date1 следует после date2; в противном случае 'отрицательное число'. Значение '0' означает, что обе даты равны.

Очень важно отметить, что:

  • Если мы хотим сравнить только часть даты и не заботимся о том, какая это часть времени, то используем экземпляры LocalDate.
  • LocalDateTime и ZonedDateTime также сравнивают временную часть, поэтому даже если день, который они представляют, является одним и тем же календарным днем, если время не совпадает, то они не равны.
  • Используйте toLocalDate() для получения части даты из экземпляров LocalDateTime и ZonedDateTime.

1.3.Демо

Программа Java для сравнения двух экземпляров класса LocalDate.

LocalDate today = LocalDate.now();LocalDate anotherDay = LocalDate.of(2018, 01, 10);System.out.println(today.isEqual(anotherDay)); //falseSystem.out.println(today.isAfter(anotherDay)); //trueSystem.out.println(today.isBefore(anotherDay)); //falseint diff = today.compareTo(anotherDay);if(diff > 0) {System.out.println(today + " is greater than " + anotherDay);} else if(diff < 0) {System.out.println(today + " is less than " + anotherDay);} else {System.out.println(today + " is equal to " + anotherDay);}

Программа Java для сравнения с экземплярами LocalDateTime.

LocalDateTime instance = LocalDateTime.now();// To have different time part in both instancesThread.currentThread().sleep(100);LocalDateTime anotherInstance = LocalDateTime.now();// Compare only date partboolean isEqual = instance.toLocalDate().isEqual(anotherInstance.toLocalDate());System.out.println(isEqual); //true// Compare date and time partsSystem.out.println(instance.isEqual(anotherInstance)); // falseSystem.out.println(instance.isAfter(anotherInstance)); // falseSystem.out.println(instance.isBefore(anotherInstance)); // true

Программа Java для сравнения двух экземпляров ZonedDateTime. Обратите внимание, что сравнение с использованием compareTo() основано сначала на моменте, затем на локальной дате-времени, затем на идентификаторе зоны, затем на хронологии. Другими словами, он сравнивает все поля даты и времени в обоих экземплярах. Таким образом, если два экземпляра представляют абсолютно одинаковое время на универсальной временной шкале, но они находятся в разных часовых поясах, то метод compareTo() не вернет ноль.

Чтобы правильно сравнить два ZonedDateTime относительно времени эпохи, сравните поле zdt.toInstant(). Или мы можем использовать методы isBefore(), isEqual() или isAfter(), которые сравнивают секунды эпохи.

ZonedDateTime now = ZonedDateTime.now();//If we want to convert to the same instant in diferent timezoneZonedDateTime nowInUTC = now.withZoneSameInstant(ZoneId.of("UTC"));ZonedDateTime zdtInUTC = ZonedDateTime.parse("2022-02-15T11:21:12.123+05:30[UTC]");long difference = nowInUTC.toInstant().compareTo(zdtInUTC.toInstant());if(difference > 0) {System.out.println("zoneddatetime1 > zoneddatetime2");} else if(difference < 0) {System.out.println("zoneddatetime1 < zoneddatetime2");} else {System.out.println("\"zoneddatetime1 = zoneddatetime2");}

2. Сравнение дат до Java 7

2.1 Основные классы

Наиболее используемые классы дат до Java 7 были:

2.2 Методы сравнения

Оба класса Date и Calendar имеют методы before(), after(), equals() и compareTo() для сравнения дат.

  1. date1.after( date2 ) – возвращает true, если date1 следует после date2; в противном случае false.
  2. date1.before( date2 ) – возвращает true, если date1 предшествует date2; в противном случае false.
  3. date1.equals( date2 ) – возвращает true, если date1 и date2 равны; в противном случае false.
  4. date1.compareTo( date2 ) – Возвращает 'положительное число', если date1 следует после date2; в противном случае 'отрицательное число'. Значение '0' означает, что обе даты равны.

Примечание: Оба класса Date и Calendar имеют часть времени, и методы выше используют ее для сравнения. Таким образом, если вы хотите сравнить только часть даты и не заботитесь о части времени, то вам нужно извлечь день/месяц/год из других экземпляров и сравнить их один к одному.

2.3 Сравнение экземпляров дат

В данном коде мы сначала сравниваем два экземпляра даты, включая их временную часть.

Date date1 = new Date();// To have different time part in both instancesThread.currentThread().sleep(100);Date date2 = new Date();System.out.println(date1.equals(date2)); // falseSystem.out.println(date1.after(date2)); // falseSystem.out.println(date1.before(date2)); // true

Теперь мы сравним обе даты только по их части даты, исключая любую часть времени, связанную с экземплярами. Мы используем класс Calendar для извлечения информации о дне, месяце и годе из экземпляра Date.

Date date1 = new Date();Thread.currentThread().sleep(100);Date date2 = new Date();int diff = compareDatePartOnly(date1, date2);if(diff > 0) {System.out.println(date1 + " is greater than " + date2);} else if(diff < 0) {System.out.println(date1 + " is less than " + date2);} else {System.out.println(date1 + " is equal to " + date2);}private static int compareDatePartOnly(final Date date1, final Date date2) {Calendar cal1 = Calendar.getInstance();Calendar cal2 = Calendar.getInstance();cal1.setTime(date1);cal2.setTime(date2);int result = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);if(result == 0) {result = cal1.get(Calendar.DAY_OF_YEAR) - cal2.get(Calendar.DAY_OF_YEAR);}return result;}

Исходный код Скачать

Прокрутить вверх