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

D. *_*ács 9 java datetime iso8601 period java-time

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

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

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

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

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

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

Max*_*mer 11

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

如您所见,将相同的期间应用于不同的日期所产生的天数取决于月份以及是否为leap年。

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

  • 我会检查使用期间后得到的日期,而不是期间本身。但是我想这真的取决于API实际在做什么。 (2认同)