Java 8与Java 9中ZonedDateTime的精度差异问题咨询
Java 8与Java 9中ZonedDateTime格式化精度差异:这是预期行为,不是Bug!
先给你吃颗定心丸
你遇到的这个输出差异绝对是Java版本迭代中的预期调整,完全不是Bug。
为啥会有这个差异?
Java 9对java.time.format.DateTimeFormatter里的ISO系列格式器做了行为优化,其中ISO_OFFSET_DATE_TIME在Java 8里是固定只输出毫秒级精度(也就是小数点后三位);但到了Java 9及之后,这个格式器变得更灵活了——它会根据你要格式化的ZonedDateTime对象的实际精度来动态输出:如果系统时间能提供微秒甚至纳秒级的信息,它就会老老实实把这些细节也打印出来。
你给出的示例已经很能说明问题了
- 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 8的固定精度规则。
- 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
这里输出了六位小数的微秒级精度,一方面是Java 9的ZonedDateTime.now()能拿到更精细的系统时间,另一方面是格式器不再限制精度,会如实输出所有可用的时间细节。
想要跨版本统一输出?这样做就行
如果需要在Java 8和Java 9里得到完全一致的输出精度,你可以手动指定格式化的模式,比如强制要求只输出毫秒级:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class TimeTest { public static void main(String[] args) { // 手动指定格式,固定保留三位毫秒小数 DateTimeFormatter fixedFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); System.out.println(fixedFormatter.format(ZonedDateTime.now())); } }
这样不管在哪个Java版本运行,都会输出类似2018-01-31T10:30:49.397Z的结果。
内容的提问来源于stack exchange,提问作者Nicolas Henneaux
相关产品推荐
相关产品推荐

