Znam ten wątek jest stary teraz dwa lata, wciąż nie widać poprawną odpowiedź tutaj.
Chyba, że chcesz korzystać z Jody lub Java 8 i jeśli chcesz subtraktować daty, na które ma wpływ zmiana czasu.
Więc napisałem własne rozwiązanie. Ważnym aspektem jest to, że działa tylko jeśli naprawdę dbają tylko o terminach, ponieważ jest to konieczne, aby usunąć informację o czasie, więc jeśli chcesz coś podobnego 25.06.2014 - 01.01.2010 = 1636
, to powinien działać niezależnie od DST:
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
public static long getDayCount(String start, String end) {
long diff = -1;
try {
Date dateStart = simpleDateFormat.parse(start);
Date dateEnd = simpleDateFormat.parse(end);
//time is always 00:00:00 so rounding should help to ignore the missing hour when going from winter to summer time as well as the extra hour in the other direction
diff = Math.round((dateEnd.getTime() - dateStart.getTime())/(double) 86400000);
} catch (Exception e) {
//handle the exception according to your own situation
}
return diff;
}
W czasie jest zawsze 00:00:00
, używając podwójnego, a następnie Math.round()
powinno pomóc zignorować brakujące 60000ms (1 godzina), gdy idziesz od zimy do lata, a także dodatkową godzinę, jeśli idziesz od lata do zimy.
ten mały test JUnit4 używam to udowodnić:
@Test
public void testGetDayCount() {
String startDateStr = "01.01.2010";
GregorianCalendar gc = new GregorianCalendar(locale);
try {
gc.setTime(simpleDateFormat.parse(startDateStr));
} catch (Exception e) {
}
for (long i = 0; i < 10000; i++) {
String dateStr = simpleDateFormat.format(gc.getTime());
long dayCount = getDayCount(startDateStr, dateStr);
assertEquals("dayCount must be equal to the loop index i: ", i, dayCount);
gc.add(GregorianCalendar.DAY_OF_YEAR, 1);
}
}
... lub jeśli chcesz zobaczyć, co robi 'życie', wymień twierdzenie ze tylko:
System.out.println("i: " + i + " | " + dayCount + " - getDayCount(" + startDateStr + ", " + dateStr + ")");
... i to wyjście powinno wyglądać następująco:
i: 0 | 0 - getDayCount(01.01.2010, 01.01.2010)
i: 1 | 1 - getDayCount(01.01.2010, 02.01.2010)
i: 2 | 2 - getDayCount(01.01.2010, 03.01.2010)
i: 3 | 3 - getDayCount(01.01.2010, 04.01.2010)
...
i: 1636 | 1636 - getDayCount(01.01.2010, 25.06.2014)
...
i: 9997 | 9997 - getDayCount(01.01.2010, 16.05.2037)
i: 9998 | 9998 - getDayCount(01.01.2010, 17.05.2037)
i: 9999 | 9999 - getDayCount(01.01.2010, 18.05.2037)
wydaje się metoda ta jest wyłącznym i nie obejmuje, więc może chcieć dodać 1 do wyniku (lub dodać ** 25 ** (i nie 24) godzin do 'date2'), aby włączyć go. –
@AlaaM .: Cóż, * jeśli * chcesz, aby było włączone. Gdybym został poproszony o liczbę dni między 24 grudnia a 25 grudnia, powiedziałbym 1, nie 2 ... (I OP wydaje się być wystarczająco szczęśliwy). –
Tak, dlatego powiedziałem * może chcieć *. W moim przypadku musiałem wyświetlić "pozostałe dni do wygaśnięcia". Tak więc, moim zdaniem, ta sprawa powinna zawierać: –