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.