为什么新的Java 8 Date Time API不具有纳秒精度?

Java 8中新的Date Time API的function之一应该是纳秒精度。 但是,当我打印当前date时间到控制台像这样

DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ"); System.out.println(OffsetDateTime.now().format(formatter)); 

我只看到毫秒精度:2015-11-02T12:33:26,746000000 + 0100

操作系统似乎支持纳秒精度。 当我通过terminal打印当前的date时间

 date -Ins 

我看到2015-11-02T12:33:26,746134417 + 0100

如何在Java中获得纳秒精度? 我在Ubuntu 14.04 64位上运行Oracle Java 1.8.0_66

一般来说, java.time API具有纳秒精度。 例如:

 DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ"); OffsetDateTime odt = OffsetDateTime.of(2015, 11, 2, 12, 38, 0, 123456789, ZoneOffset.UTC); System.out.println(odt.format(formatter)); 

输出:

 2015-11-02T12:38:00,123456789+0000 

但是,它是OffsetDateTime.now()返回的时钟值,它返回的值只有毫秒。

从Java 8的Clock实现:

这里提供的时钟实现基于System.currentTimeMillis() 。 该方法几乎不能保证时钟的准确性。 需要更准确时钟的应用程序必须使用不同的外部时钟(如NTP服务器)自行实现此抽象类。

所以这里没有任何内在的不准确 – 只是使用System.currentTimeMillis()Clock的默认实现。 你可以创build你自己更精确的子类。 但是,您应该注意,添加更多的精度而不增加更多的精度可能不是非常有用。 (可以肯定的是,有些时候…)

为了给Jon Skeet的答案增加一个重要的补充, Java 9应该提供一个精确度更高的时钟 – 参见bug日志 。 背景:在许多操作系统(特别是Linux)上,有更好的时钟可用。

java.time.Clock的Java SE 8规范指出:“系统工厂方法提供基于最佳可用时钟的时钟
系统时钟。 这可能会使用System.currentTimeMillis()或更高分辨率的时钟(如果有的话)“。在JDK 8中,实现
返回的时钟是基于System.currentTimeMillis(),因此只有一个毫秒的分辨率。 在JDK 9中,执行
基于System.currentTimeMillis()正在使用的基础本地时钟,从该时钟提供最大的分辨率。 在大多数系统中,这可能是微秒,有时甚至是十分之一微秒。

假设由这些系统工厂方法返回的时钟的应用程序将始终具有几毫秒的精度并主动地依赖于它,因此可能需要被更新以便考虑更高分辨率的可能性
在API文档中说明。

还应该注意的是,第二个精度不会在闰秒附近存在(即使在Java 9中也是如此)。