Memeriksa sama ada Dua Tarikh Java Pada Hari yang Sama

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan belajar mengenai beberapa cara yang berbeza untuk memeriksa sama ada dua objek java.util.Date mempunyai hari yang sama .

Kita akan mulakan dengan mempertimbangkan penyelesaian menggunakan Java inti - iaitu, ciri Java 8 - sebelum melihat beberapa alternatif pra-Java 8.

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

2. Java Teras

Tarikh kelas mewakili masa tertentu dalam masa, dengan ketepatan milisaat . Untuk mengetahui sama ada dua objek Tarikh mengandungi hari yang sama, kita perlu memeriksa sama ada Tahun-Bulan-Hari sama untuk kedua-dua objek dan membuang aspek waktu .

2.1. Menggunakan Tempatan Tempatan

Dengan API Date-Time Java 8 yang baru, kita dapat menggunakan objek LocalDate . Ini adalah objek yang tidak berubah yang mewakili tarikh tanpa masa.

Mari lihat bagaimana kita dapat memeriksa sama ada dua objek Date mempunyai 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 menukar kedua-dua objek Date ke LocalDate menggunakan zon waktu lalai . Setelah ditukarkan, kita hanya perlu memeriksa sama ada objek LocalDate sama dengan menggunakan kaedah isEqual .

Oleh itu, dengan menggunakan pendekatan ini, kita akan dapat menentukan sama ada kedua-dua objek Date mengandungi hari yang sama.

2.2. Menggunakan Segera

Dalam contoh di atas, kami menggunakan Instant sebagai objek perantaraan ketika menukar objek Date ke objek LocalDate . Instan , diperkenalkan di Java 8, mewakili titik waktu tertentu .

Kita secara langsung dapat memotong objek Instan ke unit DAYS , yang menetapkan nilai medan waktu menjadi sifar, dan kemudian kita dapat 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 dapat menggunakan kelas SimpleDateFormat untuk menukar antara representasi objek Date dan String . Kelas ini dilengkapi dengan sokongan untuk penukaran menggunakan banyak corak. Dalam kes kami, kami akan menggunakan corak "yyyyMMdd" .

Menggunakan ini, kami akan memformat Tarikh, mengubahnya menjadi objek String , dan kemudian membandingkannya menggunakan kaedah sama dengan standard :

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

2.4. Menggunakan Kalendar

The Kalendar kelas menyediakan kaedah untuk mendapatkan nilai-nilai unit tarikh-masa yang berbeza untuk segera masa tertentu.

Pertama, kita perlu membuat contoh Kalendar dan menetapkan waktu objek Kalendar menggunakan setiap tarikh yang disediakan. Kemudian kita boleh membuat pertanyaan dan membandingkan atribut Tahun-Bulan-Hari secara individu untuk mengetahui sama ada objek Tarikh mempunyai 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 Luar

Sekarang kita mempunyai pemahaman yang baik tentang bagaimana membandingkan objek Tarikh menggunakan API baru dan lama yang ditawarkan oleh Java teras, mari kita lihat beberapa perpustakaan luaran.

3.1. Apache Commons Lang DateUtils

The DateUtils kelas menyediakan banyak utiliti berguna yang membuat ia lebih mudah untuk bekerja dengan warisan Kalendar dan Tarikh objek .

Artefak Apache Commons Lang boleh didapati dari Maven Central:

 org.apache.commons commons-lang3 3.9 

Maka kita boleh menggunakan kaedah isSameDay dari DateUtils :

DateUtils.isSameDay(date1, date2);

3.2. Perpustakaan Joda-Time

Alternatif untuk pustaka Java Date and Time inti adalah Joda-Time. Perpustakaan yang banyak digunakan ini berfungsi sebagai pengganti yang sangat baik ketika bekerja dengan Tarikh dan Masa .

Artifak ini boleh didapati di Maven Central:

 joda-time joda-time 2.10 

Di perpustakaan ini, org.joda.time.LocalDate mewakili tarikh tanpa masa . Oleh itu, kita dapat membina objek LocalDate dari objek java.util.Date dan kemudian 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 pelaksanaan yang mudah dan mudah yang boleh kita gunakan.

Begitu juga, ia juga tersedia dari Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

Dengan menggunakan perpustakaan ini, kita perlu membina objek DateTime dari objek java.util.Date . Kemudian kita boleh menggunakan kaedah 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 ringkas ini, kami telah meneroka beberapa cara untuk memeriksa sama ada dua objek java.util.Date mengandungi hari yang sama.

Seperti biasa, kod sumber penuh artikel terdapat di GitHub.