如何在Java中以纳秒为单位获取当前时间?

Him*_*ami 2 java datetime influxdb

我做了很多研究,但没有找到任何好的答案。我想以纳秒为单位获取当前日期和时间。我发现System.nanoTime()它将提供纳秒级的时间,但这与系统耗用的时间有关。表示它将在系统启动时提供时间。我需要使用当前的日期和时间(以纳秒为单位)。

我需要这样做以避免InfluxDB中的点重复,请参阅InfluxDB如何处理重复的点?因此,当我使用毫秒时,我将面临数据联合的问题。因此需要决定使用纳秒级,但问题是在使用毫微秒级生成的秒System.nanoTime()中不包含当前日期和时间数据。它给了我JVM正常运行时间,这对我来说毫无用处。

Ste*_*n C 5

从理论上讲,可以使当前时间达到纳秒精度,如下所示:

Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant();   // or Instant.now();
long seconds = instant.getEpochSecond();
long nano = instant.getNano();
// epoch nanoseconds = seconds * 10E9 + nano
Run Code Online (Sandbox Code Playgroud)

问题:

  1. systemDefaultZone()调用将为平台提供“最佳可用时钟”。JVM规范说这可能比毫秒精度要好,但这不能保证。因此,该nano值的精度可能不超过毫秒。

  2. 秒和毫微秒的值取决于本地硬件时钟的精度。在许多系统上,很难将本地时钟同步到“实时”。通常,亚毫秒级的精度具有挑战性,而表面上的纳秒级精度却是一种幻想。

  3. 即使您已经成功地将硬件时钟与“实时”同步到纳秒精度,进行上述调用以获取纪元纳秒时间的开销和可变性也会破坏纳秒精度。(诸如内存缓存可变性,主内存总线的繁忙程度等。以及自上次同步以来本地硬件时钟的漂移。)

实际上,在大多数系统上,纳秒精度是无法实现的,因此您需要避免依赖于此的设计/算法。


Him*_*ami 3

最后,感谢 Franz Wilhelmst\xc3\xb6tter 先生

\n\n

我找到了一个解决方案。使用http://jenetics.io/ 和 \nClass 调用NanoClock.java正在转换并执行 Stephen C 建议的相同技巧。我想分享这个,因为它对其他人也有用。我无法确认是否给出了精确的纳米时间,但这个技巧对我有用。@Ole VV 再次感谢您的帮助。

\n