SimpleDateFormat的parse方法首次执行正常第二次调用失效问题排查
Java时区转换parse后输出不符合预期的原因
核心问题源于java.util.Date类的设计特性和println输出Date对象的默认逻辑:
java.util.Date本身不存储任何时区信息,它仅保存Unix时间戳,即从1970-01-01 00:00:00 UTC到对应时间点的毫秒数,只要是同一个物理时间点,不管用哪个时区解析得到的Date对象,内部存储的时间戳完全一致。- 你调用
estFormat.parse(newDate)的操作实际已经生效:estFormat带纽约时区配置,会把输入的字符串2020-05-20 04:10:05识别为纽约时区的时间,转换为对应的正确时间戳,和你最开始解析得到的date对象的时间戳完全一致,因为二者指向同一个物理时间点。 - 直接
System.out.println(dateEst)输出不符合预期,是因为Date类的toString()方法默认会使用JVM的系统默认时区(你这里是PDT时区)格式化时间戳输出,所以会把同一个时间戳转换为PDT时区的时间展示,才会出现Wed May 20 01:10:05 PDT 2020的输出。
如果要验证解析结果正确,可以用配置了纽约时区的estFormat去格式化dateEst输出:
System.out.println(estFormat.format(dateEst)); // 输出:2020-05-20 04:10:05,和预期一致
补充建议:Java 8及以上版本推荐使用java.time包下的ZonedDateTime、ZoneId等类处理时区问题,这些类原生支持时区存储,不会出现上述歧义问题,同时也规避了SimpleDateFormat线程不安全的缺陷。
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

