为什么java.time.Period#normalized()无法将天标准化?

时间:2019-07-13 17:26:37

标签: java datetime java-time iso8601 period

在Java类java.time.Period中,方法normalized()的{​​{3}}中具有以下内容:

  

这将对年和月的单位进行归一化,而使天的单位保持不变。

超类的方法的Javadoc中包含以下内容:

  

规范化过程特定于每个日历系统。例如,在ISO日历系统中,年和月被标准化,而天未被标准化,[...]

我无权访问ISO 8601-1:2019的实际文本,也不想在上面花费数百个[在此处插入货币](我猜想标准化可以在{{3}中进行描述},而不是Javadoc中。)

有人可以阐明Period#normalized()为什么不能使天数归一化吗?它是否真的直接来自ISO 8601本身,还是在其他地方指定,还是仅特定于Java实现?

1 个答案:

答案 0 :(得分:10)

这是因为对于任何给定的日期,几年或几个月的时间始终是相同的时间量(相同的时间段)。一年总是12个月,所以12个月总是一年,因此可以很容易地将这部分时间归一化。

但是,天数相对于月份和年份是可变的。如果您的期限为1年1个月32天,则不能将其标准化为1年2个月,然后再固定天数,因为它可能是1天,2天,3天或4天,具体取决于您将在哪个日期应用期限。

一个月可以是28、29、30或31天。一年可以是365或366天。而且由于期间不受任何固定日期的影响,因此无法确定这些关系。

示例:

  

2019-01-01 + 01-01-32是2020-03-04

     

2020-01-01 + 01-01-32是2021-03-03

     

2020-02-01 + 01-01-32是2021-04-02

     

2020-03-01 + 01-01-32是2021-05-03

如您所见,将同一时间段应用于不同日期会导致的天数取决于月份以及是否是if年。

因此,不可能在一个时期内对天进行归一化,并且在归一化时不影响这些天。