首页 > 解决方案 > 为什么 java.time.Period#normalized() 不标准化天数?

问题描述

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

这将年和月单位标准化,而天数单位保持不变。

超类的方法在其Javadoc中有以下内容:

标准化过程特定于每个日历系统。例如,在 ISO 日历系统中,年份和月份是标准化的,但日子不是,[...]

我无法访问 ISO 8601-1:2019 的实际文本,也不想在上面花费数百 [在此处插入货币](我的猜测是规范化可能在第 1 部分:基本规则中描述,而不是在第 2 部分:扩展)。

有人可以阐明为什么Period#normalized()不使日子正常化吗?它真的直接来自 ISO 8601 本身,是在其他地方指定的,还是只是特定于 Java 实现?

标签: javadatetimejava-timeiso8601period

解决方案


这是因为对于任何给定日期,几年或几个月的时间总是相同的时间量(相同的时间段)。一年总是 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

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

因此,不可能对一个时期内的天数进行归一化,并且在归一化时不会触及这些天数。


推荐阅读