Porovnanie dátumov v Jave

1. Úvod

V tomto tutoriáli sa zameriame na to, ako porovnávať dátumy pomocou rozhrania Java 8 Date / Time API. Ponoríme sa do rôznych metód, aby sme skontrolovali, či sú dva dátumy rovnaké a ako ich môžeme porovnať.

2. Porovnanie dátumov

Základný spôsob vyjadrenia dátumu v Jave je LocalDate. Zvážme dve LocalDate objektové inštancie predstavujúce 10. augusta 2019 a 1. júla 2019:

LocalDate firstDate = LocalDate.of (2019, 8, 10); LocalDate secondDate = LocalDate.of (2019, 7, 1);

Budeme porovnávať dva LocalDate objekty pomocou isAfter (), isBefore ()a metódy isEqual (), ako aj rovná sa () a porovnať s().

Používame isAfter () metóda na kontrolu, či je inštancia dátumu po druhom zadanom dátume. Preto prejde ďalšie tvrdenie JUnit:

assertThat (firstDate.isAfter (secondDate), je (true));

Analogicky metóda isBefore () skontroluje, či je inštancia dátumu pred iným zadaným dátumom:

assertThat (firstDate.isBefore (secondDate), je (false));

Metóda isEqual () skontroluje, či dátum predstavuje rovnaký bod na miestnej časovej osi ako druhý zadaný dátum:

assertThat (firstDate.isEqual (firstDate), je (true)); assertThat (firstDate.isEqual (secondDate), je (false));

2.1. Porovnanie dátumov pomocou Porovnateľné Rozhranie

The rovná sa () metóda poskytne rovnaký výsledok ako isEqual (), ale iba ak je zadaný argument rovnakého typu (v tomto prípade LocalDate):

assertThat (firstDate.equals (secondDate), je (false));

The isEqual () namiesto toho je možné použiť metódu na porovnanie s objektmi iného typu, ako napr Japonský dátum, ThaiBuddhistDate, atď.

Môžeme porovnať dva výskyty dátumu pomocou porovnať s() metóda definovaná v Porovnateľné rozhranie:

assertThat (firstDate.compareTo (secondDate), je (1)); assertThat (secondDate.compareTo (firstDate), je (-1));

3. Porovnanie dátumových inštancií obsahujúcich časovú zložku

Táto časť vysvetľuje, ako porovnať dve LocalDateTime inštancie. LocalDateTime inštancie obsahujú dátum aj čas.

Podobne ako LocalDate, porovnávame dva LocalDateTime inštancie s metódami isAfter (), isBefore () a isEqual (). Navyše, rovná sa () a porovnať s() môžu byť použité podobným spôsobom, ako je opísané pre LocalDate.

Rovnako môžeme použiť rovnaké metódy na porovnanie dvoch ZonedDateTime inštancie. Porovnajme 8:00 miestneho času v New Yorku a 14:00 miestneho času v Berlíne, v ten istý deň:

ZonedDateTime timeInNewYork = ZonedDateTime.of (2019, 8, 10, 8, 0, 0, 0, ZoneId.of ("America / New_York")); ZonedDateTime timeInBerlin = ZonedDateTime.of (2019, 8, 10, 14, 0, 0, 0, ZoneId.of ("Európa / Berlín")); assertThat (timeInNewYork.isAfter (timeInBerlin), je (nepravda)); assertThat (timeInNewYork.isBefore (timeInBerlin), je (nepravdivé)); assertThat (timeInNewYork.isEqual (timeInBerlin), je (true));

Aj keď oboje ZonedDateTime inštancie predstavujú rovnaký časový okamih, nepredstavujú rovnaké objekty Java. Majú rôzne LocalDateTime a ZoneId polia interne:

assertThat (timeInNewYork.equals (timeInBerlin), je (nepravdivé)); assertThat (timeInNewYork.compareTo (timeInBerlin), je (-1));

4. Dodatočné porovnania

Vytvorme jednoduchú triedu nástrojov pre trochu zložitejšie porovnania.

Najskôr skontrolujeme, či sa vyskytujú inštancie LocalDateTime a LocalDate sú v ten istý deň:

public static boolean isSameDay (LocalDateTime timestamp, LocalDate localDateToCompare) {return timestamp.toLocalDate (). isEqual (localDateToCompare); }

Po druhé, skontrolujeme, či existujú dva prípady LocalDateTime sú v ten istý deň:

public static boolean isSameDay (LocalDateTime timestamp, LocalDateTime timestampToCompare) {return timestamp.truncatedTo (DAYS) .isEqual (timestampToCompare.truncatedTo (DAYS)); }

The truncatedTo (TemporalUnit) metóda skráti dátum na danej úrovni, čo je v našom príklade deň.

Po tretie, môžeme implementovať porovnanie na úrovni hodiny:

public static boolean isSameHour (LocalDateTime timestamp, LocalDateTime timestampToCompare) {return timestamp.truncatedTo (HOURS) .isEqual (timestampToCompare.truncatedTo (HOURS)); }

Nakoniec podobným spôsobom môžeme skontrolovať, či sú dve ZonedDateTime prípady sa vyskytnú v priebehu tej istej hodiny:

public static boolean isSameHour (ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) {return zonedTimestamp.truncatedTo (HOURS) .isEqual (zonedTimestampToCompare.truncatedTo (HOURS)); }

Vidíme, že dvaja ZonedDateTime objekty sa skutočne dejú v rámci tej istej hodiny, aj keď sa ich miestny čas líši (8:30 a 14:00):

ZonedDateTime zonedTimestamp = ZonedDateTime.of (2019, 8, 10, 8, 30, 0, 0, ZoneId.of ("America / New_York")); ZonedDateTime zonedTimestampToCompare = ZonedDateTime.of (2019, 8, 10, 14, 0, 0, 0, ZoneId.of ("Európa / Berlín")); assertThat (DateTimeComparisonUtils. isSameHour (zonedTimestamp, zonedTimestampToCompare), je (true));

5. Porovnanie v starom Java Date API

Pred jazykom Java 8 sme museli používať java.util.Date a java.util.Calendar triedy na manipuláciu s informáciami o dátume a čase. Dizajn starého rozhrania Java Date API má veľa nedostatkov, napríklad je zložitý a nie je bezpečný pre vlákna. The java.util.Date inštancia predstavuje „okamih v čase“ a nie skutočný dátum.

Jedným z riešení bolo použitie knižnice Joda Time. Od vydania Java 8 sa odporúča migrovať na Java 8 Date / Time API.

Podobne ako LocalDate a LocalDateTime, obidve java.util.Date a java.util.Calendar predmety majú po (), pred (), porovnať s() a rovná sa () metódy na porovnanie dvoch inštancií dátumu. Dátumy sa porovnávajú ako okamihy v čase, na úrovni milisekundy:

Date firstDate = toDate (LocalDateTime.of (2019, 8, 10, 0, 00, 00)); Dátum secondDate = toDate (LocalDateTime.of (2019, 8, 15, 0, 00, 00)); assertThat (firstDate.after (secondDate), is (false)); assertThat (firstDate.before (secondDate), je (true)); assertThat (firstDate.compareTo (secondDate), je (-1)); assertThat (firstDate.equals (secondDate), je (false));

Pre zložitejšie porovnanie môžeme použiť DateUtils z knižnice Apache Commons Lang. Táto trieda obsahuje mnoho užitočných metód riešenia problémov Dátum a Kalendár objekty:

public static boolean isSameDay (Date date, Date dateToCompare) {return DateUtils.isSameDay (date, dateToCompare); } public static boolean isSameHour (Date date, Date dateToCompare) {return DateUtils.truncatedEquals (date, dateToCompare, Calendar.HOUR); }

Na porovnanie objektov dátumu pochádzajúcich z rôznych API by sme mali najskôr vykonať správnu konverziu a až potom použiť porovnanie. Viac podrobností môžeme nájsť v našom návode Previesť dátum na LocalDate alebo LocalDateTime a Späť.

6. Záver

V tomto článku sme preskúmali rôzne spôsoby porovnania inštancií dátumu v Jave.

Triedy Java 8 Date / Time majú bohaté API na porovnanie dátumov, s časovými pásmami alebo bez nich. Tiež sme videli, ako môžeme porovnať dátumy s podrobnosťou dňa, hodiny, minúty atď.

Všetky útržky kódu uvedené v článku vrátane ďalších príkladov sú k dispozícii na GitHub.