Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么新的Java8日期时间API没有纳秒精度?_Java_Java 8_Java Time - Fatal编程技术网

为什么新的Java8日期时间API没有纳秒精度?

为什么新的Java8日期时间API没有纳秒精度?,java,java-8,java-time,Java,Java 8,Java Time,Java8中新的日期时间API的一个特性应该是纳秒精度。但是,当我像这样将当前日期时间打印到控制台时 DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ"); System.out.println(OffsetDateTime.now().format(formatter)); 我只看到毫秒精度:2015-11-02T12:33:26746000000

Java8中新的日期时间API的一个特性应该是纳秒精度。但是,当我像这样将当前日期时间打印到控制台时

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
System.out.println(OffsetDateTime.now().format(formatter)); 
我只看到毫秒精度:2015-11-02T12:33:26746000000+0100

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

date -Ins
我看到2015-11-02T12:33:26746134417+0100


在Java中如何获得纳秒精度?我在Ubuntu14.04 64位上运行Oracle Java 1.8.066,而
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中的实现:

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


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

为了给Jon Skeet的答案添加一个重要的补充,Java 9应该能够以更高的精度提供时钟-请参阅。背景:在许多操作系统(特别是Linux)上,都有更好的时钟可用

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

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


还应该注意一个(奇特的)事实,即秒精度在闰秒附近不存在,甚至在Java 9中也不存在。

关于为什么秒精度在闰秒附近不存在,有更多信息吗?这是因为存在(例如闰涂抹)?@Thunderforge有一个表达式,如
ChronoUnit.SECONDS.between(instant1,instant2)
永远不能计算闰秒数
java.time
——设计师决定隐藏闰秒,并假装每分钟由60秒组成。他们的规范正式规定了UTC-SLS,而JDK中的实际实现实际上类似于POSIX,而不是UTC-SLS——只是忽略了闰秒。所有已知的操作系统时钟(作为
Clock.systemUTC()的基础)< /代码>行为相同或应用某种时钟重置或跳跃SEC涂片。SI SECS不建模。如果您认真寻找真正的LASH SEC支持,那么考虑我的LIB Time4J。最后一位是特别重要的。在标准的消费级硬件上也有类似的问题,因为睡眠数精确的纳秒带来错误。1个CPU周期,这在抢占式多任务环境中是不可能实现的。但是,如果您只需要对各种事件进行相对排序,而不关心它们之间的精确间隔,那么高级别的精度可能会很有用。我假设时钟是单调递增的,我希望这是真的。在Ja中修复va 9.of以纳秒级的分辨率捕捉当前时刻(取决于主机硬件时钟的能力)。