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
答案 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中也是如此。