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

时间:2018-01-31 10:38:04

标签: java jvm

我执行以下代码,我在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

是否有预期的输出或错误?

2 个答案:

答案 0 :(得分:2)

javadoc(至少是java 8的javadoc)声明:

  

纳秒级的一到九位数。会有很多数字   根据需要输出。

所以两者都是正确的。

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

  

小数部分的小数位数没有限制。

[编辑] 更具体地说,我喜欢调试Java库代码。

小数秒的内部表示为397000000,然后将其划分并最终输入BigDecimal.stripTrailingZeros()以获取.397

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

答案 1 :(得分:2)

这是Java 9 JSR310的增强功能,这在故障JDK-8068730中有所描述。

  

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