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 .