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

问题描述 投票:0回答:3

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

System.nanoTime()
将提供纳秒,但那是系统经过的时间。意味着它将提供系统启动的时间。我需要以纳秒为单位使用当前日期和时间。

我需要这个来避免 InfluxDB 中的点重复,请参阅 InfluxDB 如何处理重复点? 因此,当我使用毫秒时,我面临数据联合问题。因此需要决定使用纳秒,但问题是使用

System.nanoTime()
生成纳秒时不包含当前日期和时间数据。它给了我 JVM 正常运行时间,但这对我来说毫无用处。

java datetime influxdb
3个回答
14
投票

理论上,可以使当前时间达到“优于微秒”的精度,如下所示:

Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant();   // or Instant.now();
long seconds = instant.getEpochSecond();
long nano = instant.getNano();
// epoch nanoseconds = seconds * 1E9 + nano

存在的问题:

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

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

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

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


4
投票

最后感谢Franz Wilhelmstötter先生

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


1
投票

您可以从

Instant.now()
获得 Java 所能提供的最佳准确度和精确度。这是否足以解决你的问题,我不敢说。当然,在普通计算机上无法获得纳秒精度。

您可能需要玩一些技巧,添加人工纳秒,以防

Instant.now()
返回相同的值两次。

或者简单地使用你的链接中提到的技巧:

引入任意新标签以强制唯一性。

对于添加人工纳秒的技巧,您可以使用如下所示的方法:

public class TimeProvider {

    Instant last = Instant.now().minusSeconds(1);

    Instant getUniqueInstant() {
        Instant result = Instant.now();
        if (! result.isAfter(last)) {
            result = last.plusNanos(1);
        }
        last = result;
        return result;
    }
}

当我在计算机上快速连续绘制本课程的时间时,我得到如下结果。从输出看来(我解释它的方式):

  • 我的 JVM 无法从系统时钟获得比微秒(秒为 6 位小数)更高的精度。
  • 时不时添加人工纳秒以保持瞬间的独特性。

.

2018-08-29T15:18:35.617616001Z
2018-08-29T15:18:35.617617Z
2018-08-29T15:18:35.617618Z
2018-08-29T15:18:35.617618001Z
2018-08-29T15:18:35.617619Z
2018-08-29T15:18:35.617619001Z
2018-08-29T15:18:35.617620Z
2018-08-29T15:18:35.617620001Z
2018-08-29T15:18:35.617621Z
2018-08-29T15:18:35.617621001Z
2018-08-29T15:18:35.617622Z
2018-08-29T15:18:35.617623Z
2018-08-29T15:18:35.617623001Z
2018-08-29T15:18:35.617624Z
2018-08-29T15:18:35.617624001Z
2018-08-29T15:18:35.617625Z
2018-08-29T15:18:35.617625001Z
2018-08-29T15:18:35.617626Z
2018-08-29T15:18:35.617626001Z
2018-08-29T15:18:35.617627Z
2018-08-29T15:18:35.617627001Z
2018-08-29T15:18:35.617628Z
2018-08-29T15:18:35.617631Z
2018-08-29T15:18:35.617634Z
2018-08-29T15:18:35.617635Z
2018-08-29T15:18:35.617636Z
2018-08-29T15:18:35.617636001Z
2018-08-29T15:18:35.617637Z
2018-08-29T15:18:35.617637001Z
2018-08-29T15:18:35.617638Z
© www.soinside.com 2019 - 2024. All rights reserved.