Đây KHÔNG phải là công việc của tôi, tìm thấy câu trả lời ở đây . không muốn một liên kết bị hỏng trong tương lai :).
Điều quan trọng là dòng này để tính đến cài đặt ánh sáng ban ngày, tham khảo Mã đầy đủ.
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
hoặc thử đi qua TimeZone
như một tham số để daysBetween()
và cuộc gọi setTimeZone()
trong sDate
và eDate
đối tượng.
Vì vậy, đây là:
public static Calendar getDatePart(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal;
}
getDatePart () lấy từ đây
public static long daysBetween(Date startDate, Date endDate) {
Calendar sDate = getDatePart(startDate);
Calendar eDate = getDatePart(endDate);
long daysBetween = 0;
while (sDate.before(eDate)) {
sDate.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
return daysBetween;
}
Các đặc điểm:
Tìm sự khác biệt giữa hai ngày không đơn giản bằng việc trừ hai ngày và chia kết quả cho (24 * 60 * 60 * 1000). Thật sai lầm!
Ví dụ: Sự khác biệt giữa hai ngày 24/03/2007 và 25/03/2007 phải là 1 ngày; Tuy nhiên, sử dụng phương pháp trên, ở Vương quốc Anh, bạn sẽ nhận được 0 ngày!
Xem cho chính mình (mã bên dưới). Đi theo cách mili giây sẽ dẫn đến lỗi làm tròn số và chúng trở nên rõ ràng nhất khi bạn có một số thứ như Giờ tiết kiệm ánh sáng ban ngày xuất hiện trong hình.
Mã đầy đủ:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateTest {
public class DateTest {
static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
Date d1 = new Date("01/01/2007 12:00:00");
Date d2 = new Date("01/02/2007 12:00:00");
Date d3 = new Date("03/24/2007 12:00:00");
Date d4 = new Date("03/25/2007 12:00:00");
Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);
printOutput("Manual ", d1, d2, calculateDays(d1, d2));
printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
System.out.println("---");
printOutput("Manual ", d3, d4, calculateDays(d3, d4));
printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}
private static void printOutput(String type, Date d1, Date d2, long result) {
System.out.println(type+ "- Days between: " + sdf.format(d1)
+ " and " + sdf.format(d2) + " is: " + result);
}
public static long calculateDays(Date dateEarly, Date dateLater) {
return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}
public static long daysBetween(Date startDate, Date endDate) {
...
}
ĐẦU RA:
Thủ công - Các ngày từ: 01-01-2007 đến 02-01-2007 là: 1
Dương lịch - Các ngày từ: 01/01/2007 đến 02/01/2007 là: 1
Thủ công - Các ngày từ: 24 tháng 3 năm 2007 đến ngày 25 tháng 3 năm 2007 là: 0
Lịch - Các ngày từ: 24 tháng 3 năm 2007 đến 25 tháng 3 năm 2007 là: 1