Saya perlu membandingkan dua Date
s (misalnya date1
dan date2
) dan menghasilkan boolean sameDay
yang benar dari bagian dua Date
pada hari yang sama, dan salah jika mereka tidak.
Bagaimana saya bisa melakukan ini? Sepertinya ada angin puyuh kebingungan di sini ... dan saya ingin menghindari menarik ketergantungan lain di luar JDK jika memungkinkan.
untuk mengklarifikasi: jika date1
dan date2
berbagi tahun, bulan, dan hari yang sama, maka sameDay
itu benar, jika tidak maka itu salah. Saya menyadari ini membutuhkan pengetahuan tentang zona waktu ... akan menyenangkan untuk lulus dalam zona waktu tetapi saya dapat hidup dengan GMT atau waktu setempat selama saya tahu apa perilakunya.
lagi, untuk memperjelas:
date1 = 2008 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = true
date1 = 2009 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = false
date1 = 2008 Aug 03 12:00:00
date2 = 2008 Jun 03 12:00:00
=> sameDate = false
Jawaban:
Perhatikan bahwa "hari yang sama" bukan konsep yang sederhana seperti kedengarannya ketika zona waktu yang berbeda dapat terlibat. Kode di atas akan untuk kedua tanggal menghitung hari relatif terhadap zona waktu yang digunakan oleh komputer yang menjalankannya. Jika ini bukan yang Anda butuhkan, Anda harus melewati zona waktu yang relevan untuk
Calendar.getInstance()
panggilan, setelah Anda memutuskan apa yang sebenarnya Anda maksud dengan "hari yang sama".Dan ya, Joda Time
LocalDate
akan membuat semuanya lebih bersih dan mudah (meskipun kesulitan yang sama yang melibatkan zona waktu akan hadir).sumber
Bagaimana tentang:
Anda juga dapat mengatur zona waktu ke SimpleDateFormat, jika perlu.
sumber
SimpleDateFormat
metode ini sebenarnya lebih cepat daripada yang lain yang disebutkan di sini menggunakanCalendar
s. Rata-rata dibutuhkan separuh waktu sebagaiCalendar
metode. (Setidaknya di sistem saya). Pujian!Saya menggunakan paket "apache commons lang" untuk melakukan ini (yaitu org.apache.commons.lang.time.DateUtils )
sumber
Anda dapat menghindari ketergantungan eksternal dan hit kinerja menggunakan Kalender dengan menghitung Nomor Hari Julian untuk masing-masing tanggal dan kemudian membandingkan ini:
sumber
Date
tidak merangkum gagasan zona waktu sehingga tidak ada cara untuk memperbaikinya secara sewenang-wenang.Joda-Time
Sedangkan untuk menambahkan dependensi, saya khawatir java.util.Date & .Calendar sangat buruk sehingga hal pertama yang saya lakukan untuk proyek baru adalah menambahkan perpustakaan Joda-Time. Di Java 8 Anda dapat menggunakan paket java.time baru, terinspirasi oleh Joda-Time.
Inti dari Joda-Time adalah
DateTime
kelas. Tidak seperti java.util.Date, ia memahami zona waktu yang ditentukan (DateTimeZone
). Saat mengkonversi dari juDate, tetapkan zona.LocalDate
Salah satu cara untuk memverifikasi apakah dua kali tanggal mendarat pada tanggal yang sama adalah dengan mengonversi ke
LocalDate
objek.Konversi itu tergantung pada zona waktu yang ditetapkan. Untuk membandingkan
LocalDate
objek, mereka harus dikonversi dengan zona yang sama.Berikut ini adalah sedikit metode utilitas.
Lebih baik akan menjadi argumen lain, menentukan zona waktu daripada mengasumsikan zona waktu objek DateTime pertama harus digunakan.
Representasi String
Pendekatan lain adalah membuat representasi string dari bagian tanggal setiap waktu-tanggal, kemudian membandingkan string.
Sekali lagi, zona waktu yang ditetapkan sangat penting.
Rentang waktu
Solusi umum adalah menentukan rentang waktu, lalu tanyakan apakah rentang tersebut berisi target Anda. Contoh kode ini adalah dalam Joda-Time 2.4. Perhatikan bahwa kelas terkait "tengah malam" sudah usang. Alih-alih menggunakan
withTimeAtStartOfDay
metode ini. Joda-Time menawarkan tiga kelas untuk mewakili rentang waktu dengan berbagai cara: Interval, Periode, dan Durasi.Menggunakan pendekatan "Setengah Terbuka" di mana awal rentang mencakup inklusif dan akhir.
Zona waktu target dapat berbeda dari zona waktu interval.
waktu java
Java 8 dan yang lebih baru hadir dengan kerangka java.time . Terinspirasi oleh Joda-Time, didefinisikan oleh JSR 310, dan diperpanjang oleh proyek ThreeTen-Extra. Lihat Tutorial .
Pembuat Joda-Time telah menginstruksikan kita semua untuk pindah ke java.time secepat mungkin. Sementara itu Joda-Time berlanjut sebagai proyek yang dipelihara secara aktif. Tapi berharap pekerjaan di masa depan hanya terjadi di java.time dan ThreeTen-Extra daripada Joda-Time.
Untuk meringkas java.time secara singkat ... An
Instant
adalah momen di timeline di UTC. Terapkan zona waktu (ZoneId
) untuk mendapatkanZonedDateTime
objek. Untuk memindahkan off timeline, untuk mendapatkan ide tak terbatas kabur dari tanggal-waktu, gunakan "lokal" kelas:LocalDateTime
,LocalDate
,LocalTime
.Logika yang dibahas di bagian Joda-Time dari Jawaban ini berlaku untuk java.time.
Kelas java.util.Date yang lama memiliki
toInstant
metode baru untuk konversi ke java.time.Menentukan tanggal membutuhkan zona waktu.
Kami menerapkan objek zona waktu itu
Instant
untuk mendapatkan aZonedDateTime
. Dari itu kami mengekstrak nilai hanya tanggal (aLocalDate
) karena tujuan kami adalah membandingkan tanggal (bukan jam, menit, dll.).Lakukan hal yang sama untuk
java.util.Date
objek kedua yang kita butuhkan untuk perbandingan. Saya hanya akan menggunakan momen saat ini saja.Gunakan
isEqual
metode khusus untuk menguji nilai tanggal yang sama.sumber
LocalDate localDate = LocalDate.fromDateFields(yourJavaUtilDate);
fromDateFields()
di kelas sayaLocalDate
.Konversi tanggal ke Java 8 java.time.LocalDate seperti yang terlihat di sini .
sumber
ZoneId.of("America/Phoenix")
atauZoneId.of("Europe/Budapest")
alih-alih standar sistem.Java 8
Jika Anda menggunakan Java 8 dalam proyek Anda dan membandingkan
java.sql.Timestamp
, Anda bisa menggunakanLocalDate
kelas:Jika Anda menggunakan
java.util.Date
, lihat jawaban Istvan yang kurang ambigu.sumber
date1
dandate2
sedangjava.sql.Timestamp
? Menurut pertanyaan merekaDate
, saya akan mengertijava.util.Date
. Kode Anda juga menggunakan pengaturan zona waktu komputer, yang untuk banyak tujuan akan baik-baik saja; masih saya lebih suka untuk membuat fakta ini eksplisit dalam kode.java.sql.Timestamp
. Seperti yang Anda katakan ini umumnya lebih baik untuk secara eksplisit mengatur zona waktu.sumber
UNTUK PENGGUNA ANDROID:
Anda dapat menggunakan
DateUtils.isToday(dateMilliseconds)
untuk memeriksa apakah tanggal yang diberikan adalah hari saat ini atau tidak.Referensi API: https://developer.android.com/reference/android/text/format/DateUtils.html#isToday(long)
sumber
DateUtils.isToday(x.getTime())
(x adalah contoh java.util.date) yang akan dilakukanselain solusi Binil Thomas
pemakaian
sumber
Untuk para pengembang Kotlin, ini adalah versi dengan membandingkan pendekatan string terformat:
Ini bukan cara terbaik, tetapi pendek dan berhasil.
sumber
SimpleDateFormat
kelas itu digantikan tahun yang lalu oleh modernjava.time.DateTimeFormatter
kelas didefinisikan dalam JSR 310. Menyarankan penggunaannya tahun 2019 adalah saran yang buruk.Anda dapat menerapkan logika yang sama dengan solusi SimpleDateFormat tanpa mengandalkan SimpleDateFormat
sumber