在不同长度的月份中使用时java.time.Period.between()
,为什么下面的代码会根据操作的方向报告不同的结果?
import java.time.LocalDate;
import java.time.Period;
class Main {
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2019, 1, 30);
LocalDate d2 = LocalDate.of(2019, 3, 29);
Period period = Period.between(d1, d2);
System.out.println("diff: " + period.toString());
// => P1M29D
Period period2 = Period.between(d2, d1);
System.out.println("diff: " + period2.toString());
// => P-1M-30D
}
}
实时复制:https ://repl.it/@JustinGrant/BigScornfulQueryplan#Main.java
这是我希望它工作的方式:
2019-01-30 => 2019-03-29
- 2019-01-30 加一个月 => 2019-02-30,限制为 2019-02-28
- 加 29 天到 2019-03-29
这与 Java 的结果相匹配:P1M29D
(反向)2019-03-29 => 2019-01-30
- 从 2019-03-29 减去一个月 => 2019-02-29,限制为 2019-02-28
- 减去 29 天得到 2019-01-30
但是 Java 又回到P-1M-30D
了这里。我预计P-1M-29D
。
参考文档说:
周期的计算方法是删除完整的月份,然后计算剩余的天数,调整以确保两者具有相同的符号。然后根据 12 个月的年份将月数拆分为年和月。如果月份的结束日期大于或等于月份的开始日期,则考虑一个月。例如,从
2010-01-15
到2011-03-18
是一年两个月零三天。
也许我没有仔细阅读这篇文章,但我认为这篇文章并不能完全解释我所看到的不同行为。
我对java.time.Period.between
应该如何工作有什么误解?具体来说,当“删除完整月份”的中间结果是无效日期时,预计会发生什么?
该算法是否在其他地方更详细地记录?