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