Usporedba datuma u Javi

1. Uvod

U ovom uputstvu usredotočit ćemo se na usporedbu datuma pomoću Java 8 Date / Time API-ja. Zaronit ćemo u različite metode kako bismo provjerili jesu li dva datuma jednaka i kako usporediti datume.

2. Usporedba datuma

Osnovni način izražavanja datuma na Javi je LocalDate. Razmotrimo dvije LocalDate instance objekata, koje predstavljaju 10. kolovoza 2019. i 1. srpnja 2019 .:

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

Usporedit ćemo dvije LocalDate objekata pomoću isAfter (), isBefore (), i metode isEqual (), kao i jednako () i compareTo ().

Koristimo isAfter () metoda za provjeru je li instanca datuma nakon drugog navedenog datuma. Stoga će proći sljedeća tvrdnja JUnit:

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

Analogno tome, metoda isBefore () provjerava je li instanca datuma prije drugog navedenog datuma:

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

Metoda je jednako() provjerava predstavlja li datum istu točku na lokalnoj vremenskoj traci kao i drugi navedeni datum:

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

2.1. Usporedba datuma pomoću Usporedive Sučelje

The jednako () metoda dat će isti rezultat kao je jednako(), ali samo ako je prosljeđeni argument iste vrste (u ovom slučaju, LocalDate):

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

The je jednako() metoda može se koristiti umjesto toga za usporedbu s objektima drugog tipa, kao što je JapanskiDatum, ThaiBuddhistDateitd.

Možemo usporediti dvije instance datuma pomoću compareTo () metoda, kako je definirana Usporedive sučelje:

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

3. Usporedba primjeraka datuma koji sadrže vremensku komponentu

Ovaj će odjeljak objasniti kako usporediti dva LocalDateTime instance. LocalDateTime instance sadrže datum kao i vremensku komponentu.

Slično kao LocalDate, uspoređujemo dvije LocalDateTime instance s metodama isAfter (), isBefore () i je jednako(). Dodatno, jednako () i compareTo () može se koristiti na sličan način kao što je opisano za LocalDate.

Isto tako, možemo upotrijebiti iste metode za usporedbu dviju ZonedDateTime instance. Usporedimo 8:00 po lokalnom vremenu u New Yorku i 14:00 po lokalnom vremenu u Berlinu, isti dan:

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 ("Europa / Berlin")); assertThat (timeInNewYork.isAfter (timeInBerlin), je (netačno)); assertThat (timeInNewYork.isBefore (timeInBerlin), je (netačno)); assertThat (timeInNewYork.isEqual (timeInBerlin), je (true));

Iako oboje ZonedDateTime instance predstavljaju isti trenutak u vremenu, ne predstavljaju jednake Java objekte. Oni imaju drugačije LocalDateTime i ZoneId interna polja:

assertThat (timeInNewYork.equals (timeInBerlin), je (netačno)); assertThat (timeInNewYork.compareTo (timeInBerlin), je (-1));

4. Dodatne usporedbe

Stvorimo jednostavnu klasu korisnosti za malo složenije usporedbe.

Prvo ćemo provjeriti jesu li primjeri LocalDateTime i LocalDate su isti dan:

javna statička logička vrijednost isSameDay (vremenska oznaka LocalDateTime, LocalDate localDateToCompare) {return timestamp.toLocalDate (). isEqual (localDateToCompare); }

Drugo, provjerit ćemo jesu li dva slučaja LocalDateTime su isti dan:

javna statička logička vrijednost isSameDay (vremenska oznaka LocalDateTime, LocalDateTime timestampToCompare) {return timestamp.truncatedTo (DAYS) .isEqual (timestampToCompare.truncatedTo (DAYS)); }

The truncatedTo (TemporalUnit) metoda skraćuje datum na zadanoj razini, što je u našem primjeru dan.

Treće, usporedbu možemo provesti na razini sata:

javna statička logička vrijednost isSameHour (vremenska oznaka LocalDateTime, LocalDateTime timestampToCompare) {return timestamp.truncatedTo (HOURS) .isEqual (timestampToCompare.truncatedTo (HOURS)); }

Napokon, na sličan način možemo provjeriti jesu li dva ZonedDateTime slučajevi se događaju u istom satu:

javna statička logička vrijednost isSameHour (ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) {return zonedTimestamp.truncatedTo (HOURS) .isEqual (zonedTimestampToCompare.truncatedTo (HOURS)); }

To dvoje možemo vidjeti ZonedDateTime objekti se zapravo događaju u istom satu, čak i ako su njihova lokalna vremena različita (8:30 odnosno 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 ("Europa / Berlin")); assertThat (DateTimeComparisonUtils. isSameHour (zonedTimestamp, zonedTimestampToCompare), je (true));

5. Usporedba u API-ju Old Java Date

Prije Jave 8 morali smo koristiti java.util.Datum i java.util.Kalendar satovi za manipulaciju informacijama o datumu / vremenu. Dizajn starog API-ja Java Date ima brojne nedostatke, poput složenosti i nesigurnosti. The java.util.Datum instanca predstavlja "trenutak u vremenu", a ne stvarni datum.

Jedno od rješenja bilo je korištenje knjižnice Joda Time. Od izdavanja Jave 8, preporučuje se prelazak na Java 8 Datum / Vrijeme API.

Slično kao LocalDate i LocalDateTime, oboje java.util.Datum i java.util.Kalendar predmeti imaju nakon(), prije(), compareTo () i jednako () metode za usporedbu dvaju datuma. Datumi se uspoređuju kao trenutci u vremenu, na razini milisekunde:

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

Za složenije usporedbe možemo koristiti DateUtils iz biblioteke Apache Commons Lang. Ova klasa sadrži mnoge korisne metode za rješavanje Datum i Kalendar objekti:

javna statička logička vrijednost isSameDay (Datum datum, Datum dateToCompare) {return DateUtils.isSameDay (datum, dateToCompare); } javna statička logička vrijednost isSameHour (datum, datum, datum dateToCompare) {return DateUtils.truncatedEquals (date, dateToCompare, Calendar.HOUR); }

Da bismo usporedili datumske objekte koji potječu iz različitih API-ja, prvo bismo trebali napraviti ispravnu konverziju, a tek onda primijeniti usporedbu. Više pojedinosti možemo pronaći u našem vodiču Pretvaranje datuma u LocalDate ili LocalDateTime i Back.

6. Zaključak

U ovom smo članku istražili različite načine usporedbe instanci datuma u Javi.

Klase datuma / vremena Java 8 imaju bogate API-je za usporedbu datuma, sa ili bez vremena i vremenskih zona. Također smo vidjeli kako usporediti datume na granulaciju dana, sata, minute itd.

Svi isječci koda spomenuti u članku, uključujući dodatne primjere, dostupni su na GitHubu.