Memeriksa apakah Dua Tanggal Jawa Pada Hari yang Sama

1. Ikhtisar

Dalam tutorial singkat ini, kita akan belajar tentang beberapa cara berbeda untuk memeriksa apakah dua objek java.util.Date memiliki hari yang sama .

Kami akan mulai dengan mempertimbangkan solusi yang menggunakan Java inti - yaitu, fitur Java 8 - sebelum melihat beberapa alternatif pra-Java 8.

Untuk menyelesaikannya, kita juga akan melihat beberapa perpustakaan eksternal - Apache Commons Lang, Joda-Time, dan Date4J .

2. Inti Java

Tanggal kelas mewakili waktu instan tertentu, dengan presisi milidetik . Untuk mengetahui apakah dua objek Tanggal berisi hari yang sama, kita perlu memeriksa apakah Tahun-Bulan-Hari sama untuk kedua objek dan membuang aspek waktu .

2.1. Menggunakan LocalDate

Dengan API Tanggal-Waktu baru dari Java 8, kita dapat menggunakan objek LocalDate . Ini adalah objek tetap yang mewakili tanggal tanpa waktu.

Mari kita lihat bagaimana kita dapat memeriksa apakah dua objek Tanggal memiliki hari yang sama menggunakan kelas ini:

public static boolean isSameDay(Date date1, Date date2) { LocalDate localDate1 = date1.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); LocalDate localDate2 = date2.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); return localDate1.isEqual(localDate2); }

Dalam contoh ini, kami telah mengonversi kedua objek Date ke LocalDate menggunakan zona waktu default . Setelah dikonversi, kita hanya perlu memeriksa apakah objek LocalDate sama dengan menggunakan metode isEqual .

Akibatnya, dengan menggunakan pendekatan ini, kita akan dapat menentukan apakah dua objek Tanggal berisi hari yang sama.

2.2. Menggunakan Instan

Dalam contoh di atas, kami menggunakan Instan sebagai objek perantara saat mengonversi objek Date ke objek LocalDate . Instan , diperkenalkan di Java 8, mewakili titik waktu tertentu .

Kita bisa langsung memotong objek Instan ke unit DAYS , yang menyetel nilai bidang waktu ke nol, lalu kita bisa membandingkannya:

public static boolean isSameDayUsingInstant(Date date1, Date date2) { Instant instant1 = date1.toInstant() .truncatedTo(ChronoUnit.DAYS); Instant instant2 = date2.toInstant() .truncatedTo(ChronoUnit.DAYS); return instant1.equals(instant2); }

2.3. Menggunakan SimpleDateFormat

Sejak versi awal Java, kami telah dapat menggunakan kelas SimpleDateFormat untuk mengonversi antara representasi objek Tanggal dan String . Kelas ini hadir dengan dukungan untuk konversi menggunakan banyak pola. Dalam kasus kami, kami akan menggunakan pola "yyyyMMdd" .

Dengan menggunakan ini, kami akan memformat Tanggal, mengonversinya menjadi objek String , dan kemudian membandingkannya menggunakan metode sama dengan standar :

public static boolean isSameDay(Date date1, Date date2) { SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); return fmt.format(date1).equals(fmt.format(date2)); }

2.4. Menggunakan Kalender

Kelas Kalender menyediakan metode untuk mendapatkan nilai dari unit tanggal-waktu yang berbeda untuk momen waktu tertentu.

Pertama, kita perlu membuat instance Kalender dan mengatur waktu objek Kalender menggunakan setiap tanggal yang disediakan. Kemudian kita dapat membuat kueri dan membandingkan atribut Tahun-Bulan-Hari secara individual untuk mengetahui apakah objek Tanggal memiliki hari yang sama:

public static boolean isSameDay(Date date1, Date date2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(date2); return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH); }

3. Perpustakaan Eksternal

Sekarang setelah kita memiliki pemahaman yang baik tentang bagaimana membandingkan objek Date menggunakan API baru dan lama yang ditawarkan oleh Java inti, mari kita lihat beberapa perpustakaan eksternal.

3.1. Apache Commons Lang DateUtils

The DateUtils kelas menyediakan banyak utilitas berguna yang membuatnya lebih mudah untuk bekerja dengan warisan Kalender dan Tanggal benda .

Artefak Apache Commons Lang tersedia dari Maven Central:

 org.apache.commons commons-lang3 3.9 

Kemudian kita cukup menggunakan metode isSameDay dari DateUtils :

DateUtils.isSameDay(date1, date2);

3.2. Perpustakaan Joda-Time

Alternatif untuk inti Java Date and Time library adalah Joda-Time. Perpustakaan yang banyak digunakan ini berfungsi sebagai pengganti yang sangat baik saat bekerja dengan Tanggal dan Waktu .

Artefak dapat ditemukan di Maven Central:

 joda-time joda-time 2.10 

Dalam perpustakaan ini, org.joda.time.LocalDate mewakili tanggal tanpa waktu . Oleh karena itu, kita dapat membuat objek LocalDate dari objek java.util.Date dan membandingkannya:

public static boolean isSameDay(Date date1, Date date2) { org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1); org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2); return localDate1.equals(localDate2); }

3.3. Perpustakaan Date4J

Date4j juga menyediakan implementasi langsung dan sederhana yang dapat kita gunakan.

Demikian juga, ini juga tersedia dari Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

Menggunakan pustaka ini, kita perlu membuat objek DateTime dari objek java.util.Date . Kemudian kita cukup menggunakan metode isSameDayAs :

public static boolean isSameDay(Date date1, Date date2) { DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault()); DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault()); return dateObject1.isSameDayAs(dateObject2); }

4. Kesimpulan

Dalam tutorial singkat ini, kita telah mempelajari beberapa cara untuk memeriksa apakah dua objek java.util.Date berisi hari yang sama.

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.