【问题标题】:Accurate System time准确的系统时间
【发布时间】:2016-06-29 17:51:28
【问题描述】:

在java中获得最准确的系统时间(小时分钟和秒)的最佳方法是毫秒。我一直在研究时钟、日期和日历对象。我希望能够以最准确的系统时间为数据包添加时间戳,并通过网络发送(如果可能,精确到 Milli 甚至 NanoSeconds)。

【问题讨论】:

  • 系统时钟的准确度取决于系统,而不是 Java - 在大多数平台上,您希望的最佳值是 15 毫秒左右。 Instant.now() 会给你当前时间。
  • @BoristheSpider 我确实也看过 Instant.now() 但它只给了我精确到小数点后三位的准确性。如果我使用日历对象并在其上调用 getTimeInMillis(),它会给我更高的准确性。所以我很困惑。
  • 小数点后三位什么Instanthas nanos。但正如我上面所说,特定时间戳的单位是完全不相关的,您的操作系统可能会以 10 毫秒为单位进行记录,因此您的时间戳是否以毫秒/微/纳米/皮秒为单位没有意义。
  • @BoristheSpider 这就是它的内容。 “2016-06-29T17:54:32.919Z”所以秒计数器的小数点后三位。这也是UTC,我猜我看不到获取本地时间的方法。另外,这次是否有快照,以便我可以保存它并对这个时间对象执行操作?
  • Instant 的默认 String 表示如何影响任何事情?您也可以将其格式化为只有一年。请在进一步发布之前请阅读至少一个教程。

标签: java systemtime


【解决方案1】:

Java 9

java.time 框架支持分辨率高达nanosecond 的值。这意味着最多九 (9) 位秒的小数部分。

Java 9 及更高版本中,Clock 的新实现可以捕获当前时刻,直至达到nanosecond 分辨率。但是“您的里程可能会有所不同”。实际分辨率和实际精度取决于主机硬件时钟能力。

Instant instant = Instant.now();

2016-01-02T12:34:56.123456789Z

Java 8

与 Java 9 相同,java.time 类最高支持 nanosecond 分辨率。

但当前时刻只能以millisecond 分辨率捕获。这意味着只有三 (3) 位或更少的小数秒数。此限制是因为用于 Clock 的旧版实现。

Java 6 和 7

最初与 Java 的最早版本捆绑在一起的旧日期时间类仅支持毫秒分辨率。这包括java.util.Datejava.util.Calendarjava.util.GregorianCalendar。这些旧的类也设计得很糟糕,令人困惑和麻烦。避开他们。

大部分 java.time 功能在 ThreeTen-Backport 项目中向后移植,并在 ThreeTenABP 项目中进一步适应 Android。

据我所知,这些都依赖于相同的旧实现,只有毫秒级的分辨率。

准确度

Accuracy and precision 始终取决于您的主机硬件时钟能力。

查看问题,How precise is the internal clock of a modern PC?

据我了解当今常见的计算机硬件,您不能指望当前时刻会以一纳秒的精度捕获。

【讨论】:

  • 优秀的总结。主要是系统时钟分辨率可能低于纳秒。
  • 非常感谢您的解释。太糟糕了,它只能捕获毫秒的分辨率。这是我正在研究的一个小型 API 的一部分,我基本上需要这种精度。可悲的是,java 破坏了我的交易。
  • @Krish 如果以毫秒为单位捕获当前时刻真的那么重要,那么请考虑将 Java 9 预发布代码中的 Clock 实现拉到您自己的应用程序中,并使用您自己的 Clock 类。 (如果你能遵守它的 GPL 许可证。)我不知道这涉及到什么;您必须浏览 OpenJDK 源代码。请注意 java.time 类如何允许注入 Clock 对象。 Instant.now( Clock clock)
  • @Krish 另一种可能性是调用本机代码以访问特定于平台的库以从主机操作系统获取当前时刻。有几种方法可以从 Java 调用本机代码,JNI 就是其中之一,尽管我相信有一种更新更简单的方法(不知道细节)。
  • @Krish 仅供参考……Java Native Access(JNA) 是 JNI 的更简单替代方案。 (我也没有使用过。)此外,您可以结合这些想法,制作一个Clock 实现,它将对主机操作系统时钟库的本机代码调用包装起来。祝你好运。
【解决方案2】:

如果您想以纳秒为单位获取时间,请使用 system.nanoTime();这将是最好的

【讨论】:

  • 没有。如文档中所述; nanoTime 是自 JVM 启动以来经过的 nanos。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多