Java日期时间API历经三代演进:第一代(Date/Calendar)线程不安全、设计混乱;第二代受Joda-Time影响;第三代(java.time,JSR-310)不可变、线程安全、语义清晰,核心类如LocalDateTime、Instant、ZonedDateTime职责分明,源码体现策略模式、不变性与历法抽象。

阅读 Java 日期时间 API 的源码,关键不在“通读全部”,而在于带着问题定位核心类、理解设计演进、对比新旧实现差异。Java 的日期时间 API 经历了三代演进:第一代(Date/SimpleDateFormat/Calendar)、第二代(Joda-Time 影响)、第三代(JSR-310,即 java.time 包)。源码分析必须分代切入,否则容易迷失。
明确目标:先搞清你在看哪一代 API 的源码
不同代的源码位置、设计哲学、线程安全性、可变性都完全不同:
-
第一代(
java.util.Date、SimpleDateFormat、Calendar):源码在src.zip的java.base模块中,但大部分方法已标@Deprecated。重点看Date构造器如何封装毫秒值、SimpleDateFormat的parse和format如何共用Calendar缓冲区(导致非线程安全)。 -
第三代(
java.time.*):源码位于java.base的java.time及子包(如java.time.format、java.time.chrono)。这是现代推荐路径,源码结构清晰、不可变、线程安全。从LocalDateTime.now()入口,顺藤摸瓜到Clock.systemDefaultZone()→System.currentTimeMillis(),就能串起整个时间获取链路。
从入口方法开始,用 IDE 跟踪调用链
不要一上来就打开 Date.java 从头看。以实际使用场景为起点:
- 想弄懂
LocalDateTime.parse("2026-10-09T04:23:00")怎么工作?直接在 IDE 中 Ctrl+Click 进入parse方法,它会跳转到静态工厂方法 →DateTimeFormatter.ISO_LOCAL_DATE_TIME.parse→ 最终进入DateTimeFormatterBuilder的解析逻辑。注意观察TemporalAccessor如何被逐步填充字段。 - 好奇
Instant.now()底层怎么拿到毫秒?点进去会看到它调用System.nanoTime()或System.currentTimeMillis(),再封装成纳秒级Instant—— 这正是 JSR-310 对精度和语义的升级。
重点关注设计模式与关键抽象
JSR-310 源码大量使用不变性、策略模式和组合模式:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
DateTimeFormatter是策略模式典型:一个格式器实例可复用,内部持有DateTimePrinterParser链,每个节点负责一段解析或格式化逻辑。 -
TemporalAdjuster(如DayOfWeekInMonth)是函数式接口,源码里看其实现类如何操作Temporal字段,理解“调整器”为何比手动加减更安全可靠。 -
ChronoLocalDate和JapaneseChronology等体现多历法支持,源码中可见其通过Chronology抽象统一处理年月日计算,而非硬编码格里高利历。
对照 Javadoc 和 JSR-310 规范原文
OpenJDK 源码注释质量很高,但有些设计取舍需回溯规范文档。例如:
- 为什么
LocalDateTime不包含时区?因为 JSR-310 明确划分了“无时区的本地时间”与“带时区的时刻”(ZonedDateTime),源码中二者完全隔离,没有隐式转换。 - 为什么
Duration和Period分开?源码中前者基于纳秒,后者基于年/月/日字段,连构造方法签名都不同——这直接源于规范对“时间跨度”和“日历跨度”的严格区分。
源码不是字典,而是设计思路的具象化。从一个具体方法出发,理清数据流向、对象协作和约束边界,比逐行阅读更有效。Java 8+ 的 java.time 源码结构规整、职责分明,是学习现代 Java API 设计的优质范本。

















