(years, months within a year, days within a month)
由于时代的开始计算。
在这个解释中,有意义的是日是影响日期的最小单位。
作为一个例子如下:
LocalDate date = LocalDate.of(1996, 2, 29);
LocalDate plusSecond = date.plus(1, ChronoUnit.SECONDS);
返回
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds
...这说明,在使用LocalDate
和添加的秒数(或更小的单位来驱动精度),则无法克服您的问题中列出的限制。
看着你的执行过程,你会发现LocalDate.plusYears()
加上年后,调用resolvePreviousValid()
。然后,此方法检查闰年和修改在以下方式天字段:
day = Math.min(day, IsoChronology.INSTANCE.isLeapYear((long)year)?29:28);
在它通过有效地扣除1天纠正它换句话说。
您可以使用Year.length()
,它返回给定年份的天数,并返回闰年的。所以,你可以这样做:
LocalDate plusYear = date.plus(Year.of(date.getYear()).length(), ChronoUnit.DAYS);
你仍然会碰到以下古怪(来电Year.length()
与简洁天数代替):
LocalDate date = LocalDate.of(1996, 2, 29);
LocalDate plusYear = date.plus(365, ChronoUnit.DAYS);
System.out.println(plusYear);
Period between = Period.between(date, plusYear);
System.out.println(between.getYears() + "y " +
between.getMonths() + "m " +
between.getDays() + "d");
回报
1997-02-28
0y 11m 30d
然后
LocalDate date = LocalDate.of(1996, 3, 29);
LocalDate plusYear = date.plus(365, ChronoUnit.DAYS);
System.out.println(plusYear);
Period between = Period.between(date, plusYear);
System.out.println(between.getYears() + "y " +
between.getMonths() + "m " +
between.getDays() + "d");
回报
1997-03-29
1y 0m 0d
最后:
LocalDate date = LocalDate.of(1996, 2, 29);
LocalDate plusYear = date.plus(366, ChronoUnit.DAYS);
System.out.println(plusYear);
Period between = Period.between(date, plusYear);
System.out.println(between.getYears() + "y " +
between.getMonths() + "m " +
between.getDays() + "d");
回报:
1997-03-01
1y 0m 1d
请注意,,而不是天移动日期从上升周期11个月和30天到1年和1天(增加2天!)。
我相信你的产品代码实际上并没有增加1年,并试图计算它刚添加的年数。你究竟在努力实现什么?给我们实际的投入和预期的产出。 – dotvav
@dotvav:给出的例子似乎很清楚,我没有看到任何问题。 –
如果你真的想要一年的差异而不是零,那么就简单地减去年份数字,而不考虑任何月份或月份的部分。 –