新版日期时间API(java.time)优于旧API,因其设计上概念清晰、不可变且线程安全、API直观易用、精度更高并支持多历法扩展。

新版日期时间 API(java.time)比老版 java.util.Date 和 Calendar 好用,核心在于它从设计源头就规避了旧 API 的顽疾:概念不清、线程不安全、反直觉、难维护。
概念清晰,职责分明
旧 API 把“日期”“时间”“时区”“时刻”全塞进一个类里:Date 本质是毫秒时间戳,却叫“Date”;Calendar 又负责计算又管时区还带状态。结果是开发者总在猜——这个方法改的是哪部分?要不要重置其他字段?
新 API 拆得干净:
-
LocalDate:只管年月日,不含时间,也不涉及时区 -
LocalTime:只管时分秒纳秒,不含日期 -
LocalDateTime:日期 + 时间,仍无时区语义 -
Instant:纯机器时间,精确到纳秒,对应 UTC 时间戳 -
ZonedDateTime:带时区的完整时间,明确表达“某地几点”
不可变 + 线程安全,天然适合现代开发
旧 API 是可变对象:Date.setTime()、Calendar.set() 直接修改自身,多线程共享时就像共用一支笔写同一张纸——谁最后写谁说了算,bug 难复现难定位。
立即学习“Java免费学习笔记(深入)”;
新 API 所有类都是 final 且不可变:
- 调用
plusDays(3)、withHour(14)等方法,返回的是全新对象,原值毫发无损 - 无需加锁、无需每次 new 实例、无需担心工具类被并发污染
- 配合函数式编程、Stream、Optional 使用毫无违和感
API 直观,少踩坑、少绕弯
旧 API 充满历史包袱:
-
Date.getYear()返回 2026−1900 = 126,不是 2026 -
Calendar.JANUARY == 0,用户选“1月”你得传 0 -
SimpleDateFormat非线程安全,static 定义必出问题 - 算两个日期差几天?要自己除以 86400000,还得防负数、闰秒、时区偏移
新 API 用人类语言说话:
-
LocalDate.of(2026, 10, 12)—— 年月日直接写,不偏移 -
ChronoUnit.DAYS.between(d1, d2)—— 差几天?一行搞定 -
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")—— 格式化器本身线程安全,可复用 -
LocalDateTime.now().plusHours(2).withMinute(30)—— 链式调用,意图一目了然
精度更高,扩展性更强
旧 Date 最高只支持毫秒;新 API 默认纳秒级精度,满足高并发、金融、日志追踪等场景需求。
同时支持 ISO 日历体系以外的历法(如日本和历、泰国佛历),通过 java.time.chrono 包可扩展自定义日历,老 API 完全没这能力。


















