Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java7中获取国际原子时_Java_Time_Java 7_Java Time_Tai Time - Fatal编程技术网

如何在Java7中获取国际原子时

如何在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

我正在从事一个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的摘录:

<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()或类似的)

[结论]

TAI
TAI是一种测量时间的系统,其中每秒钟都被计算,并且“所有秒都相等”——即每秒钟由相同的时间段组成,所有秒(包括闰秒)都计入总数。这意味着以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)