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 dan itu harus menjadi 29. Bisa zona waktu/lokasi menjadi masalah?
Masalahnya adalah bahwa karena Daylight Saving Time shift (pada hari minggu, 8 Maret, tahun 2020), ada 28 hari, 23 jam di antara tanggal tersebut. TimeUnit.Hari-HARI.mengkonversi(...)
memotong hasil untuk 28 hari.
Untuk melihat masalah (I'm di AS bagian Timur zona waktu):
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
System.out.println(diff);
System.out.println("Days: " + TimeUnit.DAYS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Hours: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Days: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS) / 24.0);
Output
lang-none Dua miliar lima ratus dua juta Hari: 28 Jam: 695 Hari: 28.958333333333332
Untuk memperbaikinya, gunakan zona waktu yang doesn't memiliki DST, misalnya UTC:
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
Output
lang-none Dua miliar lima ratus lima juta enam ratus ribu Hari: 29 Jam: 696 Hari: 29.0
Penyebab dari masalah ini adalah yang sudah disebutkan di Andreas's jawaban.
Pertanyaannya adalah apa sebenarnya yang anda ingin menghitung. Fakta bahwa anda menyatakan bahwa perbedaan yang sebenarnya harus menjadi 29 bukannya 28, dan bertanya apakah "lokasi/zona waktu bisa menjadi masalah", mengungkapkan apa yang sebenarnya anda ingin menghitung. Rupanya, anda ingin menyingkirkan setiap zona perbedaan.
Saya berasumsi bahwa anda hanya ingin menghitung hari, tanpa waktu dan timezone.
Di bawah ini, dalam contoh berapa jumlah hari antara bisa dihitung dengan benar, aku'm menggunakan kelas yang mewakili persis bahwa – tanggal tanpa waktu dan timezone – LocalDate
.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MM-yyyy HH:mm:ss");
LocalDate start = LocalDate.parse("1-03-2020 00:00:00", formatter);
LocalDate end = LocalDate.parse("30-03-2020 00:00:00", formatter);
long daysBetween = ChronoUnit.DAYS.between(start, end);
Perhatikan bahwa ChronoUnit
, DateTimeFormatter
dan LocalDate
memerlukan setidaknya Java 8, yang tidak tersedia untuk anda, menurut [tag:jawa-7] tag. Namun, itu mungkin adalah untuk pembaca masa depan.
Seperti yang disebutkan oleh Ole V. V., ada's juga ThreeTen Backport, yang backports Jawa 8 Tanggal dan Waktu fungsi API untuk Java 6 dan 7.