以下2个案例的期间结果(从2016年2月28/29开始至2017年3月1日)彼此相同。
你能帮忙解释这个奇怪的行为吗?
案例1:2016年2月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年2月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
答案 0 :(得分: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年到底意味着什么?它可以同样被视为“二月的最后一天”或开始日期加上365天。后一个定义在闰年2月29日前几天引起问题:
February 1 2016 + 1 year == January 31 2017
February 1 2017 + 1 year == February 1 2018
这会让人感到困惑。
这是我们日历工作方式的一个怪癖,现有的行为似乎最小化(但不是消除)行为“令人惊讶”的日期。