首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么新的Java 8 Date Time API没有纳秒精度?

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

Stack Overflow用户
提问于 2015-11-02 20:34:00
回答 2查看 13.2K关注 0票数 75

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
date -Ins

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

如何在Java中获得纳秒精度?我在Ubuntu14.04 64位操作系统上运行Oracle Java 1.8.0_66

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 20:39:40

一般来说,java.time应用编程接口的精度是纳秒级的。例如:

代码语言:javascript
复制
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));

输出:

代码语言:javascript
复制
2015-11-02T12:38:00,123456789+0000

然而,它是由OffsetDateTime.now()返回的时钟值,它返回一个只有毫秒的值。

来自Java8中的Clock实现:

这里提供的时钟实现是基于System.currentTimeMillis()的。这种方法很少或根本不能保证时钟的准确性。需要更精确时钟的应用程序必须自己使用不同的外部时钟来实现此抽象类,例如NTP服务器。

因此,这里没有什么不精确的地方--只是使用System.currentTimeMillis()Clock的默认实现。您可以创建自己的更精确的子类。但是,您应该注意到,添加更多的精度而不添加更多的精度可能并不是非常有用。(诚然,有些时候可能会...)

票数 107
EN

Stack Overflow用户

发布于 2015-11-02 21:09:33

为了对Jon Skeet的答案做一个重要的补充,Java9应该提供一个改进精度的时钟-参见the bug log。背景:在许多操作系统(特别是Linux)上,有更好的时钟可用。

对于java.time.Clock的JavaSE8规范,

声明:“系统工厂方法提供基于最佳可用时钟的时钟

系统时钟。这可以使用System.currentTimeMillis(),或者更高分辨率的时钟(如果有的话)。

返回的时钟的分辨率是基于System.currentTimeMillis()的,因此只有毫秒级的分辨率。在JDK 9中,实现

基于System.currentTimeMillis()使用的底层本机时钟,提供该时钟可用的最大分辨率。在大多数系统上,这可以是微秒,有时甚至是十分之一微秒。

因此,假设由这些系统工厂方法返回的时钟将始终具有毫秒精度并主动依赖于该时钟的应用程序可能需要更新,以便考虑到更高分辨率的可能性

API文档中所述的。

还应该注意到一个(奇异的)事实,即秒精度不会接近闰秒-甚至在Java9中也不存在。

票数 59
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33477695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档