java.time.Instant上的Java 8文档状态:
瞬间的范围需要存储一个大于长的数字。为了达到这个目的,类存储一个长的表示时间的秒和一个表示纳秒的int,这个值总是在0到999,999之间。
根据System.currentTimeMillis()文档,Java 8时钟最多只能保证毫秒分辨率:
请注意,虽然返回值的时间单位是毫秒,但该值的准确性取决于底层操作系统,而且可能更大。
如果Java 8最多只保证毫秒精度,那么Java如何计算java.time.Instant纳秒秒值?
发布于 2020-02-28 01:17:31
Instant类只是保证纳秒精度(即nanos的值将以纳秒为单位提供)。它不保证纳秒精度(即该值可能不能准确地表示当前的纳秒数)。
一个简单的乘法器(由特定的SystemClock类实例指定)是将可以获得的任何单元转换为纳秒所需的全部。
其他要点:
您链接的System.currentTimeMillis方法的文档并没有说“充其量”,它只是承诺尽它所能做得更好。
其次,通过(例如) Instant.now()中的堆栈跟踪,可以看到该方法的实现。在我的机器的java 8设置(Mac,JDK1.8.0.241)上,这回到了使用SystemClock类,它最终使用了System.currentTimeMillis()和Instant.ofEpochMillis。在这种方法中,您可以看到它只是将'epoch‘乘以1_000_000。
然而,在java的后期版本中,这种情况已经发生了变化。
发布于 2020-02-28 00:49:27
Java使用Clock类获取当前即时信息。Clock.systemUTC()返回最佳可用的系统时钟实例,可以返回更精确的时间戳。
也就是说,Windows上的Java 8使用System.currentTimeMillis()作为源,因此它返回毫秒精确的时间。但这并不能保证,其他实现可以提供更精确的时间。
还请注意,Instant不一定是通过Instant.now()调用获得的。您可以从输入数据中解析它,例如,纳秒精度可能很有用。
https://stackoverflow.com/questions/60443791
复制相似问题