Java 8和Java 9之间ZoneDateTime精度的差异

我执行以下代码,我在Java 8和Java 9之间得到了不同的精度。

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())); } } 

用Java 8输出

 $ 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 

而Java 9

 $ 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()

它是Java 9 JSR310的增强版,这在门票JDK-8068730中有所描述。

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