Membandingkan Tanggal di Jawa

1. Perkenalan

Dalam tutorial ini, kita akan fokus pada bagaimana membandingkan tanggal menggunakan Java 8 Date / Time API. Kami akan mempelajari metode berbeda untuk memeriksa apakah dua tanggal sama dan bagaimana membandingkan tanggal.

2. Membandingkan Tanggal

Cara dasar untuk mengekspresikan tanggal di Java adalah LocalDate . Mari pertimbangkan dua instance objek LocalDate , yang mewakili 10 Agustus 2019 dan 1 Juli 2019:

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

Kita akan membandingkan dua objek LocalDate dengan memanfaatkan metode isAfter () , isBefore () , dan isEqual (), serta equals () dan CompareTo () .

Kami menggunakan metode isAfter () untuk memeriksa apakah tanggal instance setelah tanggal lain yang ditentukan. Oleh karena itu, pernyataan JUnit berikutnya akan diteruskan:

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

Secara analogi, metode isBefore () memeriksa apakah tanggal instance sebelum tanggal lain yang ditentukan:

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

Metode isEqual () memeriksa apakah tanggal mewakili titik yang sama di garis waktu lokal seperti tanggal lain yang ditentukan:

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

2.1. Membandingkan Tanggal Menggunakan Antarmuka Sebanding

Metode equals () akan memberikan hasil yang sama seperti isEqual () , tetapi hanya jika argumen yang diberikan berjenis sama (dalam hal ini, LocalDate ):

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

Metode isEqual () dapat digunakan sebagai gantinya untuk membandingkan dengan objek dari tipe yang berbeda, seperti JapaneseDate , ThaiBuddhistDate , dll.

Kita bisa membandingkan dua contoh tanggal dengan menggunakan metode bandingkanTo () , seperti yang didefinisikan oleh antarmuka Comparable :

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

3. Membandingkan Contoh Tanggal yang Mengandung Komponen Waktu

Bagian ini akan menjelaskan cara membandingkan dua instance LocalDateTime . Instance LocalDateTime berisi tanggal serta komponen waktu.

Mirip dengan LocalDate , kami membandingkan dua instance LocalDateTime dengan metode isAfter () , isBefore () dan isEqual () . Selain itu, equals () dan bandingkanTo () dapat digunakan dengan cara yang sama seperti yang dijelaskan untuk LocalDate.

Demikian juga, kita dapat menggunakan metode yang sama untuk membandingkan dua instance ZonedDateTime . Mari bandingkan 8:00 waktu setempat di New York dan 14:00 waktu setempat 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));

Meskipun kedua instance ZonedDateTime mewakili momen waktu yang sama, keduanya tidak mewakili objek Java yang sama. Mereka memiliki bidang LocalDateTime dan ZoneId yang berbeda secara internal:

assertThat(timeInNewYork.equals(timeInBerlin), is(false)); assertThat(timeInNewYork.compareTo(timeInBerlin), is(-1));

4. Perbandingan Tambahan

Mari buat kelas utilitas sederhana untuk perbandingan yang sedikit lebih kompleks.

Pertama, kami akan memeriksa apakah instance LocalDateTime dan LocalDate berada di hari yang sama:

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

Kedua, kami akan memeriksa apakah dua instance LocalDateTime berada pada hari yang sama:

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

Metode truncatedTo (TemporalUnit) memotong tanggal pada level tertentu , yang dalam contoh kami adalah hari.

Ketiga, kita dapat menerapkan perbandingan pada level satu jam:

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

Terakhir, dengan cara serupa, kami dapat memeriksa apakah dua instance ZonedDateTime terjadi dalam jam yang sama:

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

Kita dapat melihat bahwa dua objek ZonedDateTime sebenarnya terjadi dalam jam yang sama, meskipun waktu lokalnya berbeda (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 di Old Java Date API

Sebelum Java 8, kami harus menggunakan java.util.Date dan java.util.Calendar kelas untuk memanipulasi informasi tanggal / waktu. Desain Java Date API lama memiliki banyak kekurangan, seperti rumit dan tidak aman untuk thread. The java.util.Date Misalnya merupakan “instan dalam waktu” dan bukan tanggal nyata.

Salah satu solusinya adalah dengan menggunakan perpustakaan Joda Time. Sejak rilis Java 8, disarankan untuk bermigrasi ke API Tanggal / Waktu Java 8.

Mirip dengan LocalDate dan LocalDateTime , baik objek java.util.Date dan java.util.Calendar memiliki metode after () , before () , CompareTo () dan equals () untuk membandingkan dua instance tanggal . Tanggal-tanggal tersebut dibandingkan sebagai waktu instan, pada tingkat milidetik:

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 pustaka Apache Commons Lang. Kelas ini berisi banyak metode praktis untuk menangani objek Tanggal dan Kalender :

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 tanggal yang berasal dari API yang berbeda, pertama-tama kita harus melakukan konversi yang tepat dan baru kemudian menerapkan perbandingannya. Kita dapat menemukan detail lebih lanjut dalam tutorial Convert Date to LocalDate atau LocalDateTime dan Back.

6. Kesimpulan

Dalam artikel ini, kami telah menjelajahi berbagai cara untuk membandingkan contoh tanggal di Java.

Kelas Tanggal / Waktu Java 8 memiliki API yang kaya untuk membandingkan tanggal, dengan atau tanpa zona waktu dan waktu. Kami juga telah melihat cara membandingkan tanggal dengan perincian hari, jam, menit, dll.

Semua potongan kode yang disebutkan dalam artikel, termasuk contoh tambahan, tersedia di GitHub.