我正在研究Java7项目,我们需要一个国际原子时间的时间戳.我发现了一些与此相关的问题,指向JSR-310和ThreeTen Project(正在实现JSR-310):
如何在Java中获得GPS时间和TAI时间?
http://www.coderanch.com/t/549178/java/java/TAI-Atomic-Time-International
但是,我正在努力研究用于Java 7的确切内容以及从何处获取它.似乎有ThreeTen的旧SourceForge和GitHub页面,以及OpenJDK页面.
我找到了Java 7反向端口,但是从Maven下载后它不包含TAIInstant类,这是我真正需要的(TIAInstant类列在ThreeTen SourceForge JavaDoc上,位于javax.time.TAIInstant下).
为了完整起见,这是我的pom.xml的摘录:
org.threeten threetenbp 0.8.1
我应该使用其他东西,我应该从哪里获取它?
注意:抱歉,我无法提供指向我所指的所有页面的链接,StackOverflow不会让每个帖子都有> 2个链接而没有更高的代表.
[编辑]
想要TAI的原因是我需要一个单调增加的时间戳,我相信TAI会满足(即使在正和负闰秒期间,因为它不关心闰秒计算所有秒数,包括飞跃秒).
从各种来源阅读了关于POSIX/Unix的时间后,我仍然不清楚在闰秒的Unix时间内发生了什么.我知道Unix时间在引用UTC时间方面是模棱两可的,但我不清楚在闰秒发生的瞬间Unix时间会发生什么?Unix时间'暂停'还是倒退例如?也许更重要的是,即使它不应该根据Unix时间规范,Unix实现是否真的遵守关于闰秒的规范......?
最后,我是否正确地说System.currentTimeMillis()将获得相当于POSIX时间(虽然以毫秒而不是秒)?
注意,我需要一个可以在JVM和机器上移植的对象(排除System.nanoTime()或类似的东西).
[结论]
TAI
TAI是一个测量时间的系统,每秒计算一次并且"所有秒都相等" - 即.每秒包含相同的时间段,所有秒数(包括闰秒)都计入总数中.这意味着TAI中的秒数(从某个任意起始点开始计算,例如Unix Epoch)是一个单调递增的整数.
POSIX时间
POSIX时间是用于测量时间的标准(不是实现).它将每天定义为恰好有86400秒.因此,POSIX时间不计算闰秒(因为偶尔一分钟可能有61秒,导致天数> 86400秒,理论上一分钟可能有59秒,导致天数<86400秒).这意味着POSIX中的'秒'具有可变长度,并且在闰秒之前/期间/之后不久,POSIX时钟可以跳过秒或重复它们.具体来说,Meno Hochschild在其答案中引用的POSIX规范指出,"实际时间与自大纪元以来秒的当前值之间的关系尚未明确."
UTC
UTC是一个时间标准,它与地球绕太阳运行的方式有关,旨在维持太阳位置与一天中的时间(在一个阈值内)之间的关系.即在地球的UTC + 0区域,太阳总是在UTC时间中午处于最高点.闰秒(正面或负面)是必要的,因为地球自转的速度不固定,并且它不会以可预测的方式变化(意味着我们无法预测何时需要闰秒 - 或者它们是否为正闰秒或负闰秒)
代表时代
在我看来,TAI和POSIX都代表"秒数"(即计算机实际存储容易的东西),而UTC是时间的"人类解释"(即年/月/日)小时:分钟:秒.毫秒)通常不会由计算机内部存储.
翻译时间
鉴于上述情况,有许多问题从POSIX(没有任何闰秒计算)转换为TAI(计算闰秒):
它需要保持闰秒的表/计数以将任何POSIX时间转换为TAI时间
即使第1点被解决,上面的POSIX Spec也不保证在闰秒期间会发生什么,所以在这种情况下我们无法准确地表示明确的时间
如果许多系统必须通信,在它们之间传递时间戳,我们必须保证闰秒的表/计数保持一致
另一方面,很容易从POSIX转换为UTC'人类解释'.它不需要知道闰秒,因为它只假设每天都有相同的秒数(虽然这些'秒'中的一些实际上有不同的时间长度).实际上,您只需使用POSIX Spec中的公式的倒数来获得各种UTC时间分量(再次参见Meno Hochschild引用的POSIX规范).