Java 8和Java 9之间的分区时间精度差异
我执行以下代码,得到了Java8和Java9之间不同的精度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
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()所使用的底层本机时钟
正在使用,提供该时钟可用的最大分辨率。
在大多数系统上,这可能是微秒,有时甚至是十分之一秒
微秒