从LocalDate添加和减去Period并不会产生相同的日期

时间:2017-01-30 21:28:39

标签: java java-time

我使用java 8 LocalDate和Period类来添加和删除年,月和日。为什么在某些情况下如果添加Period to date并删除相同的句点java 8又返回另一个日期?

    LocalDate date = LocalDate.of(2023, 1, 30);
    Period period = Period.of(6, 1, 1);
    System.out.println(date.plus(period).minus(period));

为什么结果是2023-01-31而不是2023-01-30

1 个答案:

答案 0 :(得分:9)

  

为什么在某些情况下如果添加Period to date并删除理智的句点java 8会返回另一个日期?

因为这就是日历运算的工作原理 - 几个月的长度不均匀,至少可以说是件事。

您正在添加"六年,一个月,一天"到2023年1月30日。你期望 的结果是什么?可能存在多种不同的选择......从逻辑上讲,它听起来就像你的意思" 2029年2月31日"它不存在......因此API将其推迟到2029年3月1日。

现在减去六年,从2029年3月1日开始的一个月零一天也有些含糊不清,但是在2023年1月31日这样做是合理的 - 如果你减去6年到3月1日2023年,然后1个月到2023年2月1日,然后1天到1月31日。

从根本上说:不要期望日历算法表现得像常规数学一样。它不会那样工作。