You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:24:00