Рубрики
Без рубрики

Проверка, совпадают ли Две Даты Java в один и Тот Же День

Изучите несколько различных способов проверить, имеют ли два объекта даты один и тот же день.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы узнаем о нескольких различных способах проверки наличия двух java.util.Дата объекты имеют один и тот же день .

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

Чтобы закончить, мы также рассмотрим некоторые внешние библиотеки — Apache Commons Lang, Joda-Time и Date4J .

2. Ядро Java

Класс Дата представляет определенный момент времени с точностью до миллисекунды|/. Чтобы выяснить, содержат ли два объекта Дата один и тот же день, нам нужно проверить, является ли Год-Месяц-День одинаковым для обоих объектов, и отбросить аспект времени .

2.1. Использование LocalDate

С помощью нового Date-Time API Java 8 мы можем использовать объект LocalDate . Это неизменяемый объект, представляющий дату без времени.

Давайте посмотрим, как мы можем проверить, имеют ли два объекта Date один и тот же день, используя этот класс:

public static boolean isSameDay(Date date1, Date date2) {
    LocalDate localDate1 = date1.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
    LocalDate localDate2 = date2.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
    return localDate1.isEqual(localDate2);
}

В этом примере мы преобразовали оба объекта Data в Локальную дату , используя часовой пояс по умолчанию . После преобразования нам просто нужно проверить, равны ли Локальные данные объекты, используя метод isEqual |.

Следовательно, используя этот подход, мы сможем определить, содержат ли два объекта Date один и тот же день.

2.2. Использование Мгновенного

В приведенном выше примере мы использовали Instant в качестве промежуточного объекта при преобразовании Данных объектов в Локальные данные объекты. Instant , введенный в Java 8, представляет определенный момент времени .

Мы можем напрямую усечь объекты Instant до единицы измерения ДНЕЙ , которая устанавливает значения поля времени равными нулю, а затем мы можем сравнить их:

public static boolean isSameDayUsingInstant(Date date1, Date date2) {
    Instant instant1 = date1.toInstant()
      .truncatedTo(ChronoUnit.DAYS);
    Instant instant2 = date2.toInstant()
      .truncatedTo(ChronoUnit.DAYS);
    return instant1.equals(instant2);
}

2.3. Использование SimpleDateFormat

Начиная с ранних версий Java, мы могли использовать класс SimpleDateFormat для преобразования между представлениями объектов Date и String . Этот класс поставляется с поддержкой преобразования с использованием многих шаблонов. В нашем случае мы будем использовать шаблон “гггг ММ дд” .

Используя это, мы отформатируем Дату, преобразуем ее в объект String , а затем сравним их с помощью стандартного метода equals :

public static boolean isSameDay(Date date1, Date date2) {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
    return fmt.format(date1).equals(fmt.format(date2));
}

2.4. Использование календаря

Класс Calendar предоставляет методы для получения значений различных единиц измерения даты и времени для определенного момента времени.

Во-первых, нам нужно создать экземпляр Calendar и установить время Calendar объектов, используя каждую из указанных дат. Затем мы можем запросить и сравнить атрибуты Год-Месяц-День по отдельности , чтобы выяснить, имеют ли объекты Дата один и тот же день:

public static boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR)
      && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH)
      && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
}

3. Внешние библиотеки

Теперь, когда у нас есть хорошее понимание того, как сравнивать объекты Date с использованием новых и старых API, предлагаемых core Java, давайте рассмотрим некоторые внешние библиотеки.

3.1. Apache Commons Lang DateUtils

Класс DateUtils предоставляет множество полезных утилит, облегчающих работу с устаревшими объектами Calendar и Date .

Артефакт Apache Commons Lang доступен в Maven Central :


    org.apache.commons
    commons-lang3
    3.11

Тогда мы можем просто использовать метод в тот же день из DateUtils :

DateUtils.isSameDay(date1, date2);

3.2. Библиотека Joda-Time

Альтернативой ядру Java Date и Time библиотеки является Joda-Time . Эта широко используемая библиотека служит отличной заменой при работе с датой и временем .

Артефакт можно найти на Maven Central :


    joda-time
    joda-time
    2.10

В этой библиотеке org.joda.time.LocalDate представляет дату без времени . Следовательно, мы можем построить Локальные данные объекты из java.util.Датируйте объекты, а затем сравните их:

public static boolean isSameDay(Date date1, Date date2) {
    org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1);
    org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2);
    return localDate1.equals(localDate2);
}

3.3. Библиотека Date4J

Date4j также предоставляет простую и понятную реализацию, которую мы можем использовать.

Аналогично, он также доступен из Maven Central :


    com.darwinsys
    hirondelle-date4j
    1.5.1

Используя эту библиотеку, нам нужно построить объект DateTime из java.util.Дата объект . Тогда мы можем просто использовать в тот же день, что и метод :

public static boolean isSameDay(Date date1, Date date2) {
    DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault());
    DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault());
    return dateObject1.isSameDayAs(dateObject2);
}

4. Заключение

В этом кратком руководстве мы рассмотрели несколько способов проверки наличия двух java.util.Дата объекты содержат один и тот же день.

Как всегда, полный исходный код статьи доступен на GitHub .