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

将java.util.Date(01.01.0001)转为java.time.LocalDate出现偏差的问题

问题解答

1. 结果与预期不符的原因

核心问题出在java.util.Date和SimpleDateFormat的设计缺陷,以及旧时区规则的影响:

  • java.util.Date本质是UTC时间戳,但它的底层实现对公元1年左右的日期支持存在偏差,早期儒略历转格里高利历的历法转换逻辑、以及远古时期的时区偏移规则,在旧API中都没有正确处理。
  • 你的系统时区为Europe/Berlin,SimpleDateFormat解析01.01.0001时会按柏林本地时间处理,但旧API的时区数据里,该时期柏林的时区偏移并非现在的+1小时,导致解析出的Date对应的UTC时间(即Instant)偏移了1天多,再转回本地LocalDate时就出现了日期偏差。
  • 1901年的情况同理,旧API对早期时区规则的处理不准确,最终引发日期偏移。

2. 获取01.01.0001的java.time.LocalDate的正确方式

直接使用Java 8引入的java.time包类,完全避开旧API的缺陷:

// 方式一:通过字符串解析
LocalDate targetDate = DateTimeFormatter.ofPattern("dd.MM.yyyy")
        .parse("01.01.0001", LocalDate::from);

// 方式二:直接构造日期
LocalDate targetDate = LocalDate.of(1, 1, 1);

LocalDate是纯日期类,不涉及时区和时间维度,直接解析或构造就能精准得到目标日期,不会因时区规则或旧API缺陷出现偏差。

内容的提问来源于stack exchange,提问作者Der Till

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:52:46