我执行以下代码,我在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
是否有预期的输出或错误?
答案 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()的底层本机时钟 正在使用,提供该时钟可用的最大分辨率。 在大多数系统中,这可以是微秒,有时甚至是十分之一 微秒。