1. Pengenalan
Dalam tutorial ini, kita akan memfokuskan cara membandingkan tarikh menggunakan API Tarikh / Masa Java 8. Kami akan menyelidiki kaedah yang berbeza untuk memeriksa sama ada dua tarikh sama dan bagaimana membandingkan tarikh.
2. Membandingkan Tarikh
Cara asas untuk menyatakan tarikh di Java adalah LocalDate . Mari kita pertimbangkan dua contoh objek LocalDate , yang mewakili 10 Ogos 2019 dan 1 Julai 2019:
LocalDate firstDate = LocalDate.of(2019, 8, 10); LocalDate secondDate = LocalDate.of(2019, 7, 1);
Kita akan membandingkan dua objek LocalDate dengan menggunakan kaedah isAfter () , isBefore () , dan isEqual (), dan sama dengan () dan membandingkanTo () .
Kami menggunakan kaedah isAfter () untuk memeriksa sama ada contoh tarikh adalah selepas tarikh yang ditentukan lain. Oleh itu, penegasan JUnit seterusnya akan berlalu:
assertThat(firstDate.isAfter(secondDate), is(true));
Analoginya, kaedahnya Sebelum () memeriksa sama ada tarikh tarikh sebelum tarikh yang ditentukan:
assertThat(firstDate.isBefore(secondDate), is(false));
Kaedah isEqual () cek jika tarikh yang mewakili titik yang sama pada garis masa tempatan sebagai tarikh tertentu kepada yang lain;
assertThat(firstDate.isEqual(firstDate), is(true)); assertThat(firstDate.isEqual(secondDate), is(false));
2.1. Membandingkan Tarikh Menggunakan Antara Muka Banding
Kaedah sama () akan memberikan hasil yang sama dengan isqual () , tetapi hanya jika argumen yang dilalui adalah jenis yang sama (dalam kes ini, LocalDate ):
assertThat(firstDate.equals(secondDate), is(false));
Kaedah isEqual () boleh digunakan untuk membandingkan dengan objek dari jenis yang berbeza, seperti JapaneseDate , ThaiBuddhistDate , dll.
Kita dapat membandingkan dua kejadian tarikh dengan menggunakan kaedah membandingkanTo () , seperti yang ditentukan oleh antara muka yang boleh dibandingkan :
assertThat(firstDate.compareTo(secondDate), is(1)); assertThat(secondDate.compareTo(firstDate), is(-1));
3. Membandingkan Contoh Tarikh Mengandungi Komponen Masa
Bahagian ini akan menerangkan bagaimana membandingkan dua contoh LocalDateTime . Contoh LocalDateTime mengandungi tarikh dan juga komponen waktu.
Begitu juga dengan LocalDate , kami membandingkan dua contoh LocalDateTime dengan kaedahnya ialahAfter () , isBefore () dan isEqual () . Selain itu, sama dengan () dan membandingkanTo () boleh digunakan dengan cara yang serupa seperti yang dijelaskan untuk LocalDate.
Begitu juga, kita boleh menggunakan kaedah yang sama untuk membandingkan dua contoh ZonedDateTime . Mari bandingkan jam 8:00 waktu tempatan di New York dan 14:00 waktu tempatan di Berlin, pada hari yang sama:
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("Europe/Berlin")); assertThat(timeInNewYork.isAfter(timeInBerlin), is(false)); assertThat(timeInNewYork.isBefore(timeInBerlin), is(false)); assertThat(timeInNewYork.isEqual(timeInBerlin), is(true));
Walaupun kedua-dua contoh ZonedDateTime mewakili momen yang sama dalam waktu, mereka tidak mewakili objek Java yang sama. Mereka mempunyai bidang LocalDateTime dan ZoneId yang berbeza secara dalaman:
assertThat(timeInNewYork.equals(timeInBerlin), is(false)); assertThat(timeInNewYork.compareTo(timeInBerlin), is(-1));
4. Perbandingan Tambahan
Mari buat kelas utiliti sederhana untuk perbandingan yang sedikit lebih kompleks.
Pertama, kami akan memeriksa sama ada kejadian LocalDateTime dan LocalDate pada hari yang sama:
public static boolean isSameDay(LocalDateTime timestamp, LocalDate localDateToCompare) { return timestamp.toLocalDate().isEqual(localDateToCompare); }
Kedua, kami akan memeriksa sama ada dua kejadian LocalDateTime pada hari yang sama:
public static boolean isSameDay(LocalDateTime timestamp, LocalDateTime timestampToCompare) { return timestamp.truncatedTo(DAYS) .isEqual(timestampToCompare.truncatedTo(DAYS)); }
Kaedah truncatedTo (TemporalUnit) memotong tarikh pada tahap tertentu , yang dalam contoh kita adalah sehari.
Ketiga, kita dapat melaksanakan perbandingan pada tahap satu jam:
public static boolean isSameHour(LocalDateTime timestamp, LocalDateTime timestampToCompare) { return timestamp.truncatedTo(HOURS) .isEqual(timestampToCompare.truncatedTo(HOURS)); }
Akhirnya, dengan cara yang serupa, kita dapat memeriksa sama ada dua kejadian ZonedDateTime berlaku dalam satu jam yang sama:
public static boolean isSameHour(ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) { return zonedTimestamp.truncatedTo(HOURS) .isEqual(zonedTimestampToCompare.truncatedTo(HOURS)); }
Kita dapat melihat bahawa dua objek ZonedDateTime sebenarnya berlaku dalam satu jam yang sama, walaupun waktu tempatannya berbeza (masing-masing 8:30 dan 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("Europe/Berlin")); assertThat(DateTimeComparisonUtils. isSameHour(zonedTimestamp, zonedTimestampToCompare), is(true));
5. Perbandingan dalam API Tarikh Java Lama
Sebelum Java 8, kita terpaksa menggunakan java.util.Date dan java.util.Calendar kelas untuk memanipulasi maklumat tarikh / masa. Reka bentuk Java Date API lama mempunyai banyak kekurangan, seperti rumit dan tidak selamat pada benang. Contoh java.util.Date mewakili "masa dalam masa" dan bukan tarikh sebenar.
Salah satu penyelesaiannya adalah dengan menggunakan perpustakaan Joda Time. Sejak dilancarkan Java 8, disarankan untuk berpindah ke Java 8 Date / Time API.
Begitu juga dengan LocalDate dan LocalDateTime , kedua-dua java.util.Date dan java.util. Objek kalendar mempunyai kaedah selepas () , sebelum () , membandingkanTo () dan sama () untuk membandingkan dua kejadian tarikh . Tarikh dibandingkan sebagai masa dalam masa, pada tahap milisaat:
Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 0, 00, 00)); Date 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), is(-1)); assertThat(firstDate.equals(secondDate), is(false));
Untuk perbandingan yang lebih kompleks, kita dapat menggunakan DateUtils dari perpustakaan Apache Commons Lang. Kelas ini mengandungi banyak kaedah yang berguna untuk menangani objek Tarikh dan Kalendar :
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); }
Untuk membandingkan objek tarikh yang berasal dari API yang berbeza, pertama kita harus melakukan penukaran yang betul dan hanya kemudian melakukan perbandingan. Kami boleh mendapatkan lebih banyak maklumat dalam tutorial Tukar Tarikh ke Tempatan Tempatan atau Tempatan dan Masa Lokal.
6. Kesimpulannya
Dalam artikel ini, kami telah meneroka pelbagai cara untuk membandingkan kejadian tarikh di Java.
Kelas Java 8 Date / Time mempunyai API yang kaya untuk membandingkan tarikh, dengan atau tanpa zon waktu dan waktu. Kami juga telah melihat bagaimana membandingkan tarikh mengenai butiran sehari, jam, minit, dll.
Semua coretan kod yang disebutkan dalam artikel, termasuk contoh tambahan, terdapat di GitHub.