首先,我试了这个:
Clock clock = Clock.fixed(Instant.parse("2023-05-04T01:20:20Z"), ZoneId.systemDefault());
Clock tick = Clock.tick(clock, Duration.ofMinutes(3));
System.out.println(clock.instant());
System.out.println(tick.instant());
当持续时间为3min时,20min的最近出现时间为18min,工作正常,打印如下:
2023-05-04T01:20:20Z
2023-05-04T01:18:00Z
当我不小心把它修改成Duration.ofMinutes(61)
时,事情发生了变化,它打印了这个:
2023-05-04T01:20:20Z
2023-05-04T00:40:00Z
正如API Class Clock所说:
获取一个时钟,该时钟返回从指定时钟起截断到与指定持续时间最近的事件的时刻。
那么问题是为什么结果不是2023-05-04T00:01:00Z
或2023-05-04T01:01:00Z
?结果并不像它说的那样。
1条答案
按热度按时间jdzmm42g1#
这是正确的。给定2023-05- 04 T01:20:20 Z,2023-05- 04 T00:40:00 Z确实是“61分钟”的最后一次出现。具体来说,这是自纪元以来的第459880次事件。下一次出现是2023-05- 04 T01:41:00 Z。
您可以通过查找自纪元以来的分钟数来查找此数字:
计算结果为28052680。将其除以61是 * 正好 * 459880。
参见:
TickClock
在openjdk中的实现。您可以看到它使用Math.floorMod
来查找从当前时间戳中减去多少时间(即自历元起的毫秒)。它使用当前时间戳作为被除数。