Java 8和Java 9之间的分区时间精度差异

Java 8和Java 9之间的分区时间精度差异,java,jvm,Java,Jvm,我执行以下代码,得到了Java8和Java9之间不同的精度 import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class TimeTest { public static void main(String[] args) { System.out.println(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(Z

我执行以下代码,得到了Java8和Java9之间不同的精度

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class TimeTest {

    public static void main(String[] args) {
        System.out.println(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()));
    }
}
使用Java8进行输出

$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
$ java TimeTest
2018-01-31T10:30:49.397Z
使用Java9时

$ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
$ java TimeTest
2018-01-31T10:30:02.343193Z
是否有预期的输出或错误?

javadoc(至少是java 8)声明:

一到九个数字表示纳秒。将显示尽可能多的数字 根据需要输出

因此,两者都是正确的

此外,ISO-8601规范规定(来自维基百科):

小数位数的小数位数没有限制

[编辑] 更具体地说,我开始调试Java库代码

小数秒的内部表示形式为
397000000
,然后将其除以并最终输入到
BigDecimal.stripTrailingZeros()
,以获得
.397

Java 9返回更多数字的原因是,除了使用Java都使用的
System.currentTimeMillis()
,Java 9还调用
VM.getNanoTimeAdjustment()

javadoc(至少是Java 8)声明:

一到九个数字表示纳秒。将显示尽可能多的数字 根据需要输出

因此,两者都是正确的

此外,ISO-8601规范规定(来自维基百科):

小数位数的小数位数没有限制

[编辑] 更具体地说,我开始调试Java库代码

小数秒的内部表示形式为
397000000
,然后将其除以并最终输入到
BigDecimal.stripTrailingZeros()
,以获得
.397


Java 9返回更多数字的原因是,除了使用Java都使用的
System.currentTimeMillis()
,Java 9还调用
VM.getNanoTimeAdjustment()

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


它是Java9JSR310的一个增强,这在ticket中有描述

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