2016-09-22 5 views
3

다음 두 경우에 대한 기간 결과 (은 2016 년 2 월 28 일부터 29 일까지 2017 년 3 월 1 일부터까지 시작 함)는 동일합니다.Joda-Time : 기간 계산의 윤년에 이상한 동작

이 이상한 동작을 설명해 주시겠습니까?

사례 1 : 2,016 이월 28 2017 삼월 1

Calendar start1 = Calendar.getInstance(); 
start1.set(2016, Calendar.FEBRUARY, 28, 0, 0, 0); 
Calendar end1 = Calendar.getInstance(); 
end1.set(2017, Calendar.MARCH, 1, 0, 0, 0); 
Interval i1 = new Interval(new DateTime(start1.getTime()), new DateTime(end1.getTime())) 
System.out.println(i1.toPeriod()); 

결과 : P1Y1D


케이스 2 : 2,016 이월 29 2017 삼월 1

Calendar start2 = Calendar.getInstance(); 
start2.set(2016, Calendar.FEBRUARY, 29, 0, 0, 0); 
Calendar end2 = Calendar.getInstance(); 
end2.set(2017, Calendar.MARCH, 1, 0, 0, 0); 
Interval i2 = new Interval(new DateTime(start2.getTime()), new DateTime(end2.getTime())) 
System.out.println(i2.toPeriod()); 

결과 : P1Y1D는

+3

'2016-02-28 '에 1 년을 더한 것은 무엇입니까? '2017-02-28'. --- '2016-02-29'에는 1 년 더한 무엇이 있습니까? '2017-02-28'. --- ** 같은 대답 **, 그래서 : '2017-02-28'에 1 일을 더한 것은 무엇입니까? '2017-03-01'. --- [DateTime.plus (ReadablePeriod period)]의 javadoc을 참조하십시오 (http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#plus (org.joda.time. ReadablePeriod)). – Andreas

+0

가능한 복제본 : [org.joda.time.Period가 윤년을 존중합니까?] (http://stackoverflow.com/questions/34769873/does-org-joda-time-period-respect-leap-years) –

답변

1

고려

public static void main(String[] args) throws Exception 
{ 
    LocalDate start1 = LocalDate.of(2016, Month.FEBRUARY, 28); 
    LocalDate start2 = LocalDate.of(2016, Month.FEBRUARY, 29); 
    LocalDate end = LocalDate.of(2017, Month.MARCH,  1); 
    Period year = Period.ofYears(1); 

    System.out.println(start1); 
    System.out.println(start2); 
    System.out.println(end); 
    System.out.println(start1.plus(year)); 
    System.out.println(start2.plus(year)); 
    System.out.println(start1.until(end)); 
    System.out.println(start2.until(end)); 
} 

출력

2016-02-28 
2016-02-29 
2017-03-01 
2017-02-28 
2017-02-28 
P1Y1D 
P1Y1D 

이 작동하는 당신이 원하는 방법되지 않을 수도 있습니다,하지만 구현의 일관성을 보인다.

2 월 29 일에 1 년을 추가한다는 것은 정확히 무엇을 의미합니까? 이는 "2 월의 마지막 날"또는 시작일과 365 일을 동일하게 취할 수 있습니다. 후자의 정의는 윤년의 2 월 29 일 이전에 문제가 발생합니다. 사람들을 혼란스럽게하는이 윤년의 2 월 29 일 이전에 문제가 발생합니다.

February 1 2016 + 1 year == January 31 2017 
February 1 2017 + 1 year == February 1 2018 

이것은 우리 캘린더가 작동하는 방식의 버릇이며 기존의 동작은 동작이 "놀라운"날짜를 최소화하는 것으로 나타났습니다.