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

我做了很多研究,但没有找到任何好的答案。我想在纳秒内获得当前日期和时间。我发现这System.nanoTime()将提供纳秒,但这是系统经过的时间。意味着它将提供系统启动的时间。我需要以纳秒为单位使用当前日期和时间。

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


杨__羊羊
浏览 931回答 3
3回答

慕尼黑的夜晚无繁华

理论上,可以将当前时间精确到纳秒级,如下所示: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 的值取决于本地硬件时钟的准确性。在许多系统上,保持本地时钟与“真实”时间同步是很困难的。通常,亚毫秒级精度具有挑战性,而明显的纳秒级精度只是一种错觉。即使您已经设法将硬件时钟与“实时”时间同步到纳秒精度,进行上述调用以获取纪元纳秒时间的开销和可变性将破坏纳秒精度。(诸如内存缓存可变性、主内存总线的繁忙程度等。以及自上次同步以来本地硬件时钟的漂移。)实际上,在大多数系统上,纳秒精度是无法实现的,因此您需要避免依赖于此的设计/算法。

弑天下

从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.617616001Z2018-08-29T15:18:35.617617Z2018-08-29T15:18:35.617618Z2018-08-29T15:18:35.617618001Z2018-08-29T15:18:35.617619Z2018-08-29T15:18:35.617619001Z2018-08-29T15:18:35.617620Z2018-08-29T15:18:35.617620001Z2018-08-29T15:18:35.617621Z2018-08-29T15:18:35.617621001Z2018-08-29T15:18:35.617622Z2018-08-29T15:18:35.617623Z2018-08-29T15:18:35.617623001Z2018-08-29T15:18:35.617624Z2018-08-29T15:18:35.617624001Z2018-08-29T15:18:35.617625Z2018-08-29T15:18:35.617625001Z2018-08-29T15:18:35.617626Z2018-08-29T15:18:35.617626001Z2018-08-29T15:18:35.617627Z2018-08-29T15:18:35.617627001Z2018-08-29T15:18:35.617628Z2018-08-29T15:18:35.617631Z2018-08-29T15:18:35.617634Z2018-08-29T15:18:35.617635Z2018-08-29T15:18:35.617636Z2018-08-29T15:18:35.617636001Z2018-08-29T15:18:35.617637Z2018-08-29T15:18:35.617637001Z2018-08-29T15:18:35.617638Z
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java