如何在Java7中获取国际原子时
我正在从事一个Java7项目,我们需要一个国际原子时的时间戳。我在JSR-310和Three Ten项目(正在实施JSR-310)中发现了一些与此相关的其他问题: 然而,我正在努力弄清楚Java 7到底应该使用什么以及从哪里获得它。似乎有旧的SourceForge和GitHub页面供ThreeTen使用,还有一个OpenJDK页面 我已经找到了Java7后端口,但是从Maven下载后,它没有包含TAIInstant类,这是我实际需要的(TIAInstant类在Threen SourceForge JavaDoc的javax.time.TAIInstant下列出) 为了完整起见,这是my pom.xml的摘录:如何在Java7中获取国际原子时,java,time,java-7,java-time,tai-time,Java,Time,Java 7,Java Time,Tai Time,我正在从事一个Java7项目,我们需要一个国际原子时的时间戳。我在JSR-310和Three Ten项目(正在实施JSR-310)中发现了一些与此相关的其他问题: 然而,我正在努力弄清楚Java 7到底应该使用什么以及从哪里获得它。似乎有旧的SourceForge和GitHub页面供ThreeTen使用,还有一个OpenJDK页面 我已经找到了Java7后端口,但是从Maven下载后,它没有包含TAIInstant类,这是我实际需要的(TIAInstant类在Threen SourceFor
<dependency>
<groupId>org.threeten</groupId>
<artifactId>threetenbp</artifactId>
<version>0.8.1</version>
</dependency>
三十
三个十个基点
0.8.1
我应该使用其他东西吗?我应该从哪里获得
注意:很抱歉,我无法提供指向我所指的所有页面的链接,如果没有更高的代表,StackOverflow不会让我每篇文章有>2个链接
[编辑]
想要TAI的原因是我需要一个单调递增的时间戳,我相信TAI可以实现(即使在正闰秒和负闰秒期间,因为它不关心闰秒,因为它对所有秒的计数都是相等的,包括闰秒)
在从各种来源阅读了POSIX/Unix时间之后,我仍然不清楚Unix时间在闰秒内到底发生了什么。我知道Unix时间与UTC时间的关系不明确,但我不清楚在发生闰秒的瞬间Unix时间会发生什么?例如,Unix时间是“暂停”还是倒退?也许更重要的是,即使它不应该根据Unix时间规范,Unix实现是否确实遵守关于闰秒的规范
最后,我说System.currentTimeMillis()将获得与POSIX时间相等的时间(尽管是毫秒而不是秒)对吗
注意,我需要一个跨JVM和机器可移植的对象(排除System.nanoTime()或类似的)
[结论]
TAITAI是一种测量时间的系统,其中每秒钟都被计算,并且“所有秒都相等”——即每秒钟由相同的时间段组成,所有秒(包括闰秒)都计入总数。这意味着以TAI为单位的秒数(从任意起点开始计算,例如Unix纪元)是一个单调递增的整数 POSIX时间
POSIX时间是测量时间的标准(不是实现)。它将每天定义为86400秒。因此,POSIX time不计算闰秒(因为有时一分钟可能有61秒,导致天数>86400秒,理论上一分钟可能有59秒,导致天数JSR-310-backport只支持Java 8.TAI(和真正的UTC)中包含的功能将不是受支持的功能,因此不能在backport中。唯一的替代方法是尝试包含类TAIInstant的Three Ten额外项目,但整个额外项目可能不是最新的(非常旧的代码) 我自己正在开发我的Time4J库,它除了POSIX外还支持TAI、GPS和UTC [从2014年7月开始更新:Time4J现在作为稳定版本提供。这一争论已经被考虑在内-参见示例。]
对OP: a) 是的,即使在闰秒期间,TAI也以SI秒为单位单调递增。如果只是你想要什么,你可以选择泰,但这有一个陷阱。如果您想描述civil时间戳,那么TAI会给您错误的时间戳(只需比较第一列和第二列)。原因很简单,公民生活由UTC而不是TAI统治 b) 关于我关于维基百科图表是错误的评论,我再次仔细研究了它,改变了我的想法。POSIX和TAI之间的关系不是固定的(1972年只有10秒的偏移量),因此请原谅我的错误。到目前为止,我还没有对TAI考虑太多,而是对POSIX和UTC考虑太多。但谢谢你的提问和这场启发性的辩论,所以你值得我投你一票。整件事都很棘手。当我们讨论以不同时间尺度表示的时间戳时,我们需要区分ymdhms形式和epochsecs形式。让我们详细地考虑一下1999—01-01T0:00∶00(UTC刻度): 那么为什么说TAI不计算闰秒呢?它不计算ymdhms形式中的闰秒,但当然它在第二级(单调性要求!)上计算它们。还有POSIX?它根本不计算闰秒,无论是在ymdhms格式还是在历元秒级别。所以最后我们在TAI和POSIX之间没有固定的关系。转换时需要闰秒表 c) POSIX规范说明了什么闰秒行为?看见特别要注意这样一句话:“一天中的实际时间和自纪元以来秒的当前值之间的关系是未指定的。”因此这也与闰秒有关。如果它们在闰秒之前跳转,或者在闰秒之后跳转,或者冻结1秒,则取决于时钟实现 d) 是的,
System.currentTimeMillis()
将获得与POSIX时间相等的时间(尽管是毫秒而不是秒)
e) 值得注意的是,1971年之前没有定义TAI,1958年之前也没有定义国际原子时,所以三十级额外的TAI瞬发时间在某种程度上是无稽之谈。因此,我不会在1972年之前申请TAI。我和史蒂夫·艾伦在一起,他是时间尺度方面的专家
f) 如果您需要一个“跨JVM和机器可移植”的时间对象,那么UTC本身要求在任何地方都分布/存在相同的闰秒表。如果你
i) TAI = (29 * 365 + 7) days * 86400 + 22 leap seconds + 10s (offset at 1972) = 915148832
ii) UTC = TAI - 10 = 915148822 (fixed relation between UTC and TAI on epoch-second-level)
iii) POSIX = UTC - 22 leap seconds = 915148800
=> (ymdhms-form);
i) TAI (915148800 + 32) = 1999-01-01T00:00:32 (based on TAI-"day" = 86400 SI-secs)
ii) UTC = 1999-01-01T00:00:00 (stripped off former 22 leap secs in conversion to ymdhms)
iii) POSIX = 1999-01-01T00:00:00 (fixed relation between UTC and POSIX with exception of leapsecs)