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.