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

时间:2015-11-02 12:34:00

标签: java java-8 java-time

Java 8中新的Date Time API的一个特性应该是纳秒精度。但是当我将当前日期时间打印到控制台时如此

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

操作系统似乎确实支持纳秒精度。当我通过终端打印当前日期时间

date -Ins

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

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

2 个答案:

答案 0 :(得分:105)

一般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服务器)自行实现此抽象类。

所以这里没有任何内在的不精确 - 只是使用Clock的{​​{1}}的默认实现。您可以创建自己更精确的子类。但是,您应该注意,添加更多精度而不添加更多准确度可能并不十分有用。 (有时可能会,但是......)

答案 1 :(得分:54)

为了对Jon Skeet的答案做出重要补充, Java 9应该以更高的精度提供时钟 - 请参阅the bug log。背景:在许多操作系统(尤其是Linux)上,有更好的时钟可用。

  

java.time.Clock的Java SE 8规范声明“The   系统工厂方法基于最佳可用的时钟提供时钟   系统时钟。这可能使用System.currentTimeMillis()或更高版本   分辨率时钟,如果一个可用。“。在JDK 8中实现
  返回的时钟是基于System.currentTimeMillis()和   因此只有一毫秒的分辨率。在JDK 9中,实现
  基于底层的本机时钟   System.currentTimeMillis()正在使用,提供最大分辨率   从那个时钟开始。在大多数系统上,这可能是微秒,   有时甚至是十分之一微秒。

     

假设这些时钟返回的应用程序   系统工厂方法将始终具有毫秒精度和   积极依赖它,因此可能需要更新   考虑到更大分辨率的可能性,如同   在API文档中说明。

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