2016-09-22 115 views
3

以下两种情况的期间结果(从2016年2月28日29日至2017年3月1日)彼此相同。Joda-Time:期间计算中的闰年的奇怪行为

请你帮忙解释一下这个奇怪的行为吗?

情况1:2016年02月28至2017年3月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:2016年02月29至2017年3月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期)']的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日闰年的问题:

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

这会迷惑人。

这是我们的日历工作方式的怪癖,现有的行为似乎最小化(但不是消除)行为是“令人惊讶”的日期。