在Java类java.time.Period
中,方法normalized()
的{{3}}中具有以下内容:
这将对年和月的单位进行归一化,而使天的单位保持不变。
超类的方法的Javadoc中包含以下内容:
规范化过程特定于每个日历系统。例如,在ISO日历系统中,年和月被标准化,而天未被标准化,[...]
我无权访问ISO 8601-1:2019的实际文本,也不想在上面花费数百个[在此处插入货币](我猜想标准化可以在{{3}中进行描述},而不是Javadoc中。)
有人可以阐明Period#normalized()
为什么不能使天数归一化吗?它是否真的直接来自ISO 8601本身,还是在其他地方指定,还是仅特定于Java实现?
答案 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年。
因此,不可能在一个时期内对天进行归一化,并且在归一化时不影响这些天。