为什么不支持向 java.time.Instant 添加周数?

以下代码段:

Instant inFourWeeks = Instant.now().plus(4L, ChronoUnit.WEEKS);

引发异常:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Weeks

为什么不支持周?我理解为什么不支持月份和年份,因为它们以较小的单位表示的持续时间可能会有所不同。但是一有恒定的持续时间(7天),我可以通过写以下内容来实现相同的目标:

Instant inFourWeeks = Instant.now().plus(4L * 7L, ChronoUnit.DAYS);

答案 1

它抛出每周7天不是普遍和恒定的。不同的日历系统可能会有所不同。例如,看看每周使用6天的Akan日历系统。UnsupportedTemporalTypeException


答案 2

该课程处理绝对时间,并试图避免与不同的日历系统,地区和文化如何分组解释它相关的所有歧义。Instant

一些日历系统有不同的周长,有些有不同的月份分组,年份从不同的日期开始,并以不同的方式调整闰年和闰秒(如果有的话,就像儒略历的情况一样,它有太多的闰年,偏离了它们应该与之同步的“物理”现象, 像季节,冬至和春分)。

为了避免这些问题,该课程允许您使用更精确定义和标准化的单位,如秒,分钟,小时和天。Instant

在Java中,闰秒被“平滑”了,在它们发生的一天的最后1000秒内,所以从程序员的角度来看,它们并不存在。(无论如何,计算机时钟都不是那么准确,需要经常与NTP同步。

假设 1 天为 24 SI 小时,其中 1 SI 小时定义为 60 SI 分钟,1 SI 分钟定义为 60 SI 秒,1 SI 秒定义为 9,192,631,770 个辐射周期的铯-133。24小时实际上是平均太阳日(在两个连续的“中午”之间经过的时间),因为由于椭圆轨道,太阳本身的轨道以及轨道速度的变化,每个太阳日可能会稍微长一些或更短。

您必须注意的一件重要事情是夏令时。在那些特殊的日子里,一天是25小时或23小时,这取决于时钟移动的方向。但是,该类并不关心这一点,如果在夏令时边界上添加 1 天,它仍将移动 24 小时。它不携带任何时区或区域信息(DST 是特定于国家/地区的)。Instant


推荐