Проверка дали две дати на Java са в същия ден

1. Общ преглед

В този бърз урок ще научим за няколко различни начина да проверим дали два обекта java.util.Date имат един и същи ден .

Ще започнем с разглеждане на решения, използващи основната Java - а именно, Java 8 функции - преди да разгледаме няколко алтернативи преди Java 8.

За финал ще разгледаме и някои външни библиотеки - Apache Commons Lang, Joda-Time и Date4J .

2. Основна Java

Класът Дата представлява конкретен момент във времето с точност до милисекунди . За да разберем дали два обекта Дата съдържат един и същ ден, трябва да проверим дали годината-месец-ден е еднакъв за двата обекта и да отхвърлим аспекта на времето .

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

С новия 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); }

В този пример сме преобразували и двата обекта Date в LocalDate, като използваме часовата зона по подразбиране . След преобразувания, ние просто трябва да се провери дали LOCALDATE обекти са равни с помощта на isEqual метод .

Следователно, използвайки този подход, ще можем да определим дали двата обекта Date съдържат един и същ ден.

2.2. Използване на Instant

В горния пример използвахме Instant като междинен обект при конвертиране на обекти Date в обекти LocalDate . Незабавното , въведено в Java 8, представлява определен момент от времето .

Можем директно да съкратим незабавните обекти до единицата DAYS , която задава нулевите стойности на полето за време и след това можем да ги сравним:

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 . Този клас се предлага с поддръжка за преобразуване, използвайки много модели. В нашия случай ще използваме шаблона „yyyyMMdd“ .

Използвайки това, ние ще форматираме Date, ще го преобразуваме в 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. Използване на Календар

Класът Календар предоставя методи за получаване на стойностите на различни единици дата-час за определен момент от време.

Първо, трябва да създадем екземпляр на Календар и да зададем времето на обектите на Календар , като използваме всяка от предоставените дати. След това можем да направим запитване и да сравним атрибутите Year-Month-Day поотделно, за да разберем дали обектите Date имат същия ден:

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, предлагани от основната Java, нека да разгледаме някои външни библиотеки.

3.1. Apache Commons Lang DateUtils

Класът DateUtils предоставя много полезни помощни програми, които улесняват работата с наследените обекти Календар и Дата .

Артефактът Apache Commons Lang се предлага от Maven Central:

 org.apache.commons commons-lang3 3.9 

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

DateUtils.isSameDay(date1, date2);

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

Алтернатива на основната библиотека за дата и час на Java е Joda-Time. Тази широко използвана библиотека е отличен заместител при работа с дата и час .

Артефактът може да бъде намерен в Maven Central:

 joda-time joda-time 2.10 

В тази библиотека org.joda.time.LocalDate представлява дата без време . Следователно можем да изградим обектите LocalDate от обектите java.util.Date и след това да ги сравним:

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.Date . След това може просто да използвате isSameDayAs метода :

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.Date съдържат един и същи ден.

Както винаги, пълният изходен код на статията е достъпен в GitHub.