TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
Hasilnya adalah 28, sedangkan seharusnya 29.
Mungkinkah zona waktu / lokasi menjadi masalah?
SimpleDateFormat
lagi, karena sudah usang. Gunakan paket darijava.time
sebagai gantinya. DalamSimpleDateFormat
hal ini, gunakanDateTimeFormatter
. Dalam kasus Java 7, lihat komentar Andy Turner di bawah ini.java.time
[meskipun saya perhatikan Anda berada di Java 7], ThreeTenBp , Joda).TimeUnit
tidak berpura-pura tahu tentang DST. Seperti yang dikatakan javadoc: Satu nanodetik didefinisikan sebagai seperseribu mikrodetik, mikrodetik sebagai seperseribu milidetik, satu milidetik sebagai seperseribu detik, satu menit enam puluh detik, satu jam enam puluh menit, dan satu hari sebagai dua puluh empat jam . --- Karena DST menyebabkan 2 hari dalam setahun menjadi tidak persis 24 jam,TimeUnit
salah jika DST terlibat.Jawaban:
Masalahnya adalah bahwa karena pergeseran Daylight Saving Time (pada hari Minggu, 8 Maret 2020), ada 28 hari dan 23 jam antara tanggal-tanggal tersebut.
TimeUnit.DAYS.convert(...)
memotong hasilnya menjadi 28 hari.Untuk melihat masalahnya (saya berada di zona waktu AS bagian Timur):
Keluaran
Untuk memperbaikinya, gunakan zona waktu yang tidak memiliki DST, mis. UTC :
Keluaran
sumber
GregorianCalendar
objek dan menambahkan 1 hari pada suatu waktu hingga tanggal akhir tercapai. Saya akan membayar harga tinggi untuk menghindari itu. Dan menambahkan backport perpustakaan yang sudah menjadi bagian dari Java 8, 9, 10, 11, 12, 13, ... tidak ada harga mahal. Sebaliknya, lain kali Anda perlu melakukan apa pun dengan tanggal atau waktu, itu akan menjadi keuntungan.Penyebab masalah ini sudah disebutkan dalam jawaban Andreas .
Pertanyaannya adalah apa tepatnya yang ingin Anda hitung. Fakta bahwa Anda menyatakan bahwa selisih sebenarnya seharusnya 29 bukannya 28, dan bertanya apakah "waktu lokasi / zona bisa menjadi masalah" , mengungkapkan apa yang sebenarnya ingin Anda hitung. Tampaknya, Anda ingin menyingkirkan perbedaan zona waktu.
Saya berasumsi Anda hanya ingin menghitung hari, tanpa waktu dan zona waktu.
Java 8
Di bawah ini, dalam contoh bagaimana jumlah hari di antara dapat dihitung dengan benar, saya menggunakan kelas yang menunjukkan dengan tepat bahwa - tanggal tanpa waktu dan zona waktu -
LocalDate
.Perhatikan itu
ChronoUnit
,DateTimeFormatter
danLocalDate
minta setidaknya Java 8, yang tidak tersedia untuk Anda, menurut tag java-7 . Namun, mungkin untuk pembaca masa depan.Seperti disebutkan oleh Ole VV, ada juga ThreeTen Backport , yang mendukung fungsi Java Date dan Time API ke Java 6 dan 7.
sumber
ThreeTen
;-), tetapi sayangnya itu sedang offline pada saat penulisan.) Saya akan memperbarui posting.java.time
, karena di sekolah mereka masih menggunakan kelas-kelas lama. Tetapi API Tanggal dan Waktu Java 8 dirancang dengan sangat baik - akan menjadi kerugian jika tidak menggunakannya.