我做了很多研究,但没有找到任何好的答案。 我想以纳秒为单位获取当前日期和时间。 我发现 System.nanoTime() 将提供纳秒,但那是系统耗时。意味着它将提供系统启动的时间。我需要以纳秒为单位使用当前日期和时间。
我需要这个来避免 InfluxDB 中的点重复,请参阅 How does InfluxDB handle duplicate points?因此,当我使用毫秒时,我面临数据联合的问题。因此需要决定使用纳秒,但问题是使用 System.nanoTime() 生成纳秒时不包含当前日期和时间数据。它给了我 JVM 正常运行时间,但这对我来说毫无用处。
最佳答案
理论上,可以使当前时间达到“优于微秒”的精度,如下所示:
Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant(); // or Instant.now();
long seconds = instant.getEpochSecond();
long nano = instant.getNano();
// epoch nanoseconds = seconds * 10E9 + nano
问题:
systemDefaultZone()
调用为平台提供“最佳可用时钟”。 JVM 规范说这可能具有比毫秒更好的精度,但这并不能保证。因此,nano
值的精度可能不会高于毫秒。秒和纳秒的值取决于本地硬件时钟的精度。在许多系统上,保持本地时钟与“实时”时间同步很困难。通常,亚毫秒精度具有挑战性,而明显的纳秒精度只是一种幻觉。
即使您之前已成功将硬件时钟与“实时”时间源同步到纳秒精度,进行上述调用以获取纪元纳秒时间的开销和可变性也会淹没硬件时钟的纳秒精度。诸如内存缓存可变性、主内存总线有多繁忙等。当然,自上次外部同步以来,硬件时钟可能已经发生了漂移。
实际上,在大多数系统上,纳秒级精度是无法实现的,因此您需要避免依赖于此的设计/算法。
关于java - 如何在java中获取当前时间(以纳秒为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52077097/