이것은 내 작품이 아니며 여기 에서 답을 찾았습니다 . 미래에 끊어진 링크를 원하지 않았습니다 :).
핵심은 일광 설정을 고려하기위한이 라인, ref Full Code입니다.
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
또는 TimeZone
매개 변수로 전달 하고 및 개체를 daysBetween()
호출 setTimeZone()
하십시오 .sDate
eDate
그래서 여기에 간다 :
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 ()
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;
}
뉘앙스 :
두 날짜의 차이를 찾는 것은 두 날짜를 빼고 결과를 (24 * 60 * 60 * 1000)으로 나누는 것만 큼 간단하지 않습니다. 사실, 그 오류입니다!
예 : 2007 년 3 월 24 일과 2007 년 3 월 25 일 두 날짜의 차이는 1 일이어야합니다. 그러나 위의 방법을 사용하면 영국에서는 0 일이됩니다!
직접 참조하십시오 (아래 코드). 밀리 초 방식으로 진행하면 반올림 오류가 발생하며 일광 절약 시간과 같은 작은 문제가 발생하면 오류가 가장 분명해집니다.
전체 코드 :
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) {
...
}
산출:
수동-2007 년 1 월 1 일과 2007 년 1 월 2 일 사이의 날짜 : 1
달력-2007 년 1 월 1 일과 2007 년 1 월 2 일 사이의 날짜 : 1
수동-2007 년 3 월 24 일과 2007 년 3 월 25 일 사이의 날짜 : 0
달력-2007 년 3 월 24 일과 2007 년 3 월 25 일 사이의 날짜 : 1