处理不同长度的月份时,java.time.Period.between使用的算法?

问题描述

跨月使用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

  1. 将一个月添加到2019-01-30 => 2019-02-30,限于2019-02-28
  2. 增加29天即可到达2019-03-29

这与Java的结果相符:P1M29D

(反向)2019-03-29 => 2019-01-30

  1. 从2019-03-29减去一个月=> 2019-02-29,限于2019-02-28
  2. 减去29天即可到达2019-01-30

但是Java在这里返回P-1M-30D。我期望P-1M-29D

reference docs说:

通过删除完整的月份,然后计算剩余天数,并进行调整以确保两者具有相同的符号,来计算周期。然后根据12个月的年数将月份数分为年份和月份。如果月的结束日期大于或等于月的开始日期,则考虑一个月。例如,从2010-01-152011-03-18是一年零两个月零三天。

也许我没有足够仔细地阅读本文,但是我认为本文无法完全解释我所看到的不同行为。

我对java.time.Period.between应该如何工作有什么误解?具体来说,当“ 删除完整月份”的中间结果是无效日期时,将会发生什么?

算法在其他地方有更详细的记录吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)