Tôi biết chủ đề này là hai năm cũ bây giờ, tôi vẫn không thấy một câu trả lời đúng ở đây.
Trừ khi bạn muốn sử dụng Joda hoặc có Java 8 và nếu bạn cần phải rút ngắn ngày bị ảnh hưởng bởi tiết kiệm ánh sáng ban ngày.
Vì vậy, tôi đã viết giải pháp của riêng mình. Khía cạnh quan trọng là nó chỉ có tác dụng nếu bạn thực sự chỉ quan tâm đến số ngày bởi vì nó là cần thiết để loại bỏ các thông tin thời gian, vì vậy nếu bạn muốn một cái gì đó giống như 25.06.2014 - 01.01.2010 = 1636
, điều này sẽ làm việc không phụ thuộc vào 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;
}
Khi thời gian luôn luôn là 00:00:00
, sử dụng double và sau đó Math.round()
sẽ giúp bỏ qua 60000ms mất tích (1 giờ) khi đi từ mùa đông đến mùa hè cũng như thêm giờ nếu đi từ mùa hè đến mùa đông.
Đây là một thử nghiệm Junit4 nhỏ tôi sử dụng để chứng minh điều đó:
@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);
}
}
... hoặc nếu bạn muốn xem những gì nó làm 'cuộc sống', thay thế sự khẳng định chỉ với:
System.out.println("i: " + i + " | " + dayCount + " - getDayCount(" + startDateStr + ", " + dateStr + ")");
... và đây là những gì đầu ra sẽ giống như thế:
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)
Dường như phương pháp này là độc quyền và không bao gồm, vì vậy có thể muốn thêm 1 vào kết quả (hoặc thêm ** 25 ** (và không phải 24) giờ vào 'date2') để làm cho nó bao gồm. –
@AlaaM .: Vâng, * nếu * bạn muốn làm cho nó bao gồm. Nếu tôi được hỏi số ngày từ ngày 24 tháng 12 đến ngày 25 tháng 12, tôi muốn nói 1, không phải 2 ... (Và OP có vẻ đủ hạnh phúc.) –
Vâng, đó là lý do tôi nói * có thể muốn *. Trong trường hợp của tôi, tôi cần hiển thị "ngày còn lại cho đến hết hạn". Vì vậy, theo ý kiến của tôi trường hợp này nên được bao gồm –