java.time
try {
String tglSatu = "2019-01-07";
LocalDate tglAwal = LocalDate.parse(tglSatu);
String tglDua = "2019-01-18";
LocalDate tglAkhir = LocalDate.parse(tglDua);
long bedaHari = ChronoUnit.DAYS.between(tglAwal, tglAkhir);
if (bedaHari < 0) {
bedaHari = 0;
}
System.out.println("" + bedaHari + " hari");
} catch (DateTimeParseException dtpe){
System.out.println(dtpe.getMessage());
}
Когда дни в ожидаемом порядке, как в приведенном выше фрагменте, выходные данные должны совпадать с вашими:
11 хари
Однако, если я изменю эту строку, чтобы поменять местами даты:
String tglDua = "2018-12-29";
Теперь вывод из моего кода - это то, что вы просили:
0 хари
Угловой случай: когда я говорю, что выходной сигнал в первом случае одинаков, это только чаще всего верно. Вы использовали Date.getTime
и TimeUnit.MILLISECONDS.toDays
, поэтому вы выполнили преобразование из миллисекунд в дни, предполагая, что день всегда длится 24 часа. Это не всегда так. Например, весной, когда в некоторых странах начинается летнее время (DST), день обычно составляет всего 23 часа, что приводит к тому, что ваш код считает слишком мало. Класс LocalDate
, который я использую, не имеет ни времени суток, ни часового пояса, поэтому уклоняется от этой проблемы.
Другая причина, по которой я использую java.time, современный Java-интерфейс даты и времени, заключается в том, что с ним гораздо удобнее работать, чем со старыми классами даты и времени, включая DateFormat
, SimpleDateFormat
и * 1026. *. У них были некоторые проблемы с дизайном, и нет никаких причин, по которым мы все еще должны бороться с ними.
Альтернативный вариант - сравнить даты с помощью isBefore
или isAfter
и показать сообщение, если они не в ожидаемом порядке. Например (с помощью Google Translate):
if (tglAkhir.isBefore(tglAwal)) {
System.out.println("Tanggal berada dalam urutan yang salah");
} else {
long bedaHari = ChronoUnit.DAYS.between(tglAwal, tglAkhir);
System.out.println("" + bedaHari + " hari");
}
Ссылки: