Java ZonedDateTime在夏令时转冬令时过渡阶段解析异常问题
结论
这是Java java.time 包的原生BUG,既不是使用方式错误,也不存在理解偏差。
问题根因
在夏令时切换冬令时的时间重叠时段,DateTimeFormatter 解析带时区简写(对应格式符z)的时间字符串时,没有正确读取输入字符串中时区简写对应的偏移量,而是默认采用了重叠时段中更早的夏令时偏移作为解析结果。你输入的冬令时时间被错误映射到了同本地时间的夏令时实例,因此格式化后全部输出为夏令时标识,对应的时间戳也发生了偏移。
你的预期逻辑完全符合规范:重叠时段的两个同本地时间,分别对应不同的时区偏移,携带明确时区简写的字符串解析后应当保留原始偏移,往返格式化输出应该和输入完全一致。
临时规避方案
如果需要在当前JDK版本下保证解析准确性,可以采用以下方案:
- 优先使用带明确偏移量的时间格式,比如将格式符替换为
yyyy-MM-dd HH:mm:ss.SSS XXX,输出类似2021-10-31 02:30:00.000 +01:00的格式,不存在歧义也不会被解析错误 - 必须使用时区简写的场景下,可以在解析后手动校验
ZonedDateTime的时区简写是否和输入字符串中的简写一致,如果不匹配则调用withLaterOffsetAtOverlap()方法调整为重叠时段的后一个偏移实例
你提交的BUG报告JDK-8277049已经被官方确认,后续JDK版本会针对该问题发布修复补丁。
内容的提问来源于stack exchange,提问作者Niels Basjes
相关产品推荐
相关产品推荐

