java - 如何在java中获取当前时间(以纳秒为单位)?

标签 java datetime influxdb

我做了很多研究,但没有找到任何好的答案。 我想以纳秒为单位获取当前日期和时间。 我发现 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

问题:

  1. systemDefaultZone() 调用为平台提供“最佳可用时钟”。 JVM 规范说这可能具有比毫秒更好的精度,但这并不能保证。因此,nano 值的精度可能不会高于毫秒。

  2. 秒和纳秒的值取决于本地硬件时钟的精度。在许多系统上,保持本地时钟与“实时”时间同步很困难。通常,亚毫秒精度具有挑战性,而明显的纳秒精度只是一种幻觉。

  3. 即使您之前已成功将硬件时钟与“实时”时间源同步到纳秒精度,进行上述调用以获取纪元纳秒时间的开销和可变性也会淹没硬件时钟的纳秒精度。诸如内存缓存可变性、主内存总线有多繁忙等。当然,自上次外部同步以来,硬件时钟可能已经发生了漂移。

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

关于java - 如何在java中获取当前时间(以纳秒为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52077097/

相关文章:

influxdb - influxdb 中的临时表

java - Gwt Maven 多模块。如何配置依赖项以将请求工厂代理放入共享模块中?

java - 无法引用填充的二维数组

python - 在 Python 3.4 中将 datetime.time 转换为 datetime.timedelta

android - 如何将作为 json 字符串接收到的 .net DateTime 解析为 java 的 Date 对象

python - 如何从本地时间戳获取 UTC 纪元值

带有两个 InfluxDB 的 Docker Grafana : Connection refused

influxdb - 查询 influxdb 的日期

java - 如何在不出现 NullPointEreException 的情况下将数组的大小加倍?

java - Spring Post方法与关系数据库(Rest Api)