为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2021-08-19 17:49:03
我做了很多研究,但没有找到任何好的答案。我想在纳秒内获得当前日期和时间。我发现这System.nanoTime()将提供纳秒,但这是系统经过的时间。意味着它将提供系统启动的时间。我需要以纳秒为单位使用当前日期和时间。我需要这个来避免 InfluxDB 中的点重复,请参阅InfluxDB 如何处理重复点?所以当我使用毫秒时,我面临着数据联合的问题。所以需要决定使用纳秒,但问题是当生成纳秒时,第二个使用System.nanoTime()不包含当前日期和时间数据。它给了我 JVM 正常运行时间,这对我来说毫无用处。
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

理论上,可以将当前时间精确到纳秒级,如下所示:


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值的精度可能不会超过毫秒。


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


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


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




查看完整回答
反对 回复 2021-08-19
?
弑天下

TA贡献1818条经验 获得超8个赞

从Instant.now(). 这是否足以解决你的问题,我不敢说。当然,在普通计算机上无法获得纳秒精度。


您可能需要通过添加人工纳秒来玩一些技巧,以防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


查看完整回答
反对 回复 2021-08-19
  • 3 回答
  • 0 关注
  • 930 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信