日历是否考虑了闰秒?

17

闰秒 是否受 GregorianCalendar 类支持?

如果不支持,是否有任何第三方库支持?


1
你认为需要闰秒有哪些实际应用呢?而且,由于它们的添加不太频繁,要对它们进行计算不是非常困难吗? - Makoto
它展示了实现的方法:http://joda-time.sourceforge.net/faq.html#leapseconds - Azodious
1
这更多是出于好奇,但它可能会对像交易这样的时间关键操作产生影响。闰秒是“官方”的,因此可以将其添加到时区数据中。 - Bohemian
2个回答

14
闰秒在GregorianCalendar中没有得到考虑(Oracle的源代码显示了这一点 - 其中明确假设1分钟=60秒)。而且,此外:Oracle现已正式否认闰秒支持 - 请参见Bug-ID 4272347
在Java中,没有标准的第三方库支持闰秒 - 甚至joda-time也没有。只有像this这样的专门软件才能做到这一点。
请注意,许多库确实谈论闰秒,尽管不支持,例如java.util.Date(请参见Dorofeevs的回答)。JSR 310也谈了很多,但不支持此功能。官方上,JSR 310支持UTC-SLS,不计算闰秒,只描述在闰秒事件周围的橡胶秒的扩散。实际上,JSR 310对于是否支持UNIX时间或UTC-SLS非常令人困惑(请参见下一点)。由于闰秒信息(github/threeten/issues/197)已从JSR 310代码库中删除,因此在JSR 310的范围内实现真正的UTC闰秒是绝对不可能的。在最好的情况下,您可以期望一个即将推出的外部模块(Threeten-Extra)作为JSR 310的补充,最多只能提供基本支持(它更像是UNIX时间和TAI时间尺度之间的转换,而且在我看来使用了一个基本错误的领域模型)。 System.currentTimeMillis()官方与操作系统计时器相关联。由于我所知的所有操作系统,包括Microsoft、Linux和Apple,都只基于UNIX规范,因此这个Java系统计时器不计算闰秒,只计算自1970-01-01T00:00:00.000Z以来的正常毫秒数。
由于所有这些事实,我决定建立自己的日期和时间Java库,名为Time4J,它完全支持闰秒,并以v1.0版本和LGPLv2.1许可证提供。一篇dzone-article演示了版本v4.2的支持效果。

欢迎来到stackoverflow,祝你的项目好运! - Bohemian
谢谢!我现在正在我们的项目中使用它,它的工作效果非常好(即正确地识别了例如20150701_015960是一个有效的欧洲/柏林日期,而20150701_025960不是)。然而,文档真的很少。 - mirabilos
@mirabilos,关于稀疏文档,我非常感激任何建议、问题、疑问、拉取请求以获得更好的文档等。Time4J拥有如此多的功能,使得保持文档水平并不总是容易,但我会尽力而为。 - Meno Hochschild

6

Java.util.Date API表示

"...虽然Date类旨在反映协调世界时(UTC),但根据Java虚拟机的主机环境,它可能不能完全反映出来。...大多数计算机时钟不够准确,无法反映出跳秒的差别。"

维基百科称

"由于地球的自转速度会因气候和地质事件而变化,UTC跳秒是不规则的且不可预测的。每个UTC跳秒的插入通常是由国际地球自转和参考系统服务(IERS)提前六个月决定的"

也就是说,没有一个类能知道未来的IERS决策。


2
一个 javadoc 注释,我认为它将责任从一个实现不良的类上转移开来。如果我在闰秒之前添加第二个,时间应该会前进 2 秒,但我不认为它会这样做。此外,日期算术与当前时间无关。 - Bohemian
3
我完全同意@Bohemian的观点。Oracle也知道这个糟糕的实现,我认为这就是为什么在Java 8中我们将拥有新的时间/日期API,支持闰秒的原因(http://jcp.org/aboutJava/communityprocess/edr/jsr310/guide-0.7.html)。 - Walery Strauch
+1 我曾以为闰秒是可以预测的。好答案。 - Bohemian
@Evgeniy,这个答案怎么回事?Calendar不是Date。(Date是来自JDK 1.0等版本的。) - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接