为什么 java.time.Period#normalized() 不标准化天数?

Why does java.time.Period#normalized() not normalize days?

在 Java class java.time.Period 中,方法 normalized() 在其 Javadoc 中有以下内容:

This normalizes the years and months units, leaving the days unit unchanged.

superclass' 方法在其 Javadoc 中有以下内容:

The process of normalization is specific to each calendar system. For example, in the ISO calendar system, the years and months are normalized but the days are not, [...]

我无法访问 ISO 8601-1:2019 的实际文本,也不想在上面花费数百 [insert currency](我猜规范化可能在 Part 1: Basic rules and not in Part 2: Extensions).

有人能解释一下为什么 Period#normalized() 没有将日期标准化吗?它真的直接来自 ISO 8601 本身,是在其他地方指定的,还是仅特定于 Java 实现?

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

然而,与月份和年份相关的天数是可变的。如果您有 1 年 1 个月 32 天的时间段,则不能将其标准化为 1 年 2 个月然后是固定天数,因为它可能是 1 天、2 天、3 天或 4 天,具体取决于您将在哪一天应用该期间。

一个月可以是 28、29、30 或 31 天。一年可以是 365 天或 366 天。并且由于周期独立于任何固定日期,因此无法确定这些关系。

示例:

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

2020-01-01 + 01-01-32 is 2021-03-03

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

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

如您所见,将同一时期应用于不同日期所得到的天数因月份和是否为闰年而异。

因此无法对一个时期内的天数进行归一化,并且在归一化时不涉及天数。