应直接学习java.time而非date/calendar,因其设计过时、线程不安全;核心类包括localdatetime(无时区)、zoneddatetime(带时区)、instant(时间戳)、period/duration(日期/时间差);需掌握解析格式化、日期计算、时区转换三类操作,并避开数据库时区配置、错误初始化instant、重复创建datetimeformatter等常见坑。

直接从 java.time 学起,别碰 Date 和 Calendar —— 它们设计过时、线程不安全、容易出错,2026年的新项目里已基本淘汰。
先搞懂核心类和它们的分工
java.time 不是“一个类”,而是一套职责清晰的不可变类型:
- LocalDateTime:只管“年月日时分秒”,不带时区,适合记录本地业务时间(如订单创建时间)
- ZonedDateTime:带时区的完整时间,适合跨地域系统(如全球用户登录日志)
- Instant:时间戳本质,表示从1970-01-01T00:00:00Z开始的纳秒数,适合存储和传输
- Period 和 Duration:前者算“年月日”差(如相差2年3个月),后者算“时分秒”差(如相差5小时30分钟)
动手写三类高频操作,边写边记规律
别光看API文档,用这三件事练熟最常用能力:
- 解析与格式化:用
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")解析字符串;注意大小写敏感(MM是月,mm是分) - 日期计算:调用
plusDays(7)、minusMonths(1)等链式方法,返回新对象——原对象不变 - 时区转换:用
withZoneSameInstant(ZoneId.of("Asia/Shanghai"))转换显示,而不是用withZoneSameLocal(后者会改时间值)
避开新手最容易踩的三个坑
这些错误在真实项目里反复出现,提前知道能省半天排查时间:
- 把
LocalDateTime直接存数据库却没配JDBC驱动时区(MySQL需加serverTimezone=GMT%2B8参数) - 用
new Date()或System.currentTimeMillis()初始化Instant,其实直接写Instant.now()更安全直观 - 在循环里反复创建
DateTimeFormatter实例——它线程安全且可复用,应声明为static final
用一个小项目闭环验证
写一个“会议提醒器”命令行工具:
- 输入会议开始时间(字符串)、持续分钟数、提醒提前量(如15分钟)
- 输出本地时间、UTC时间、提醒时间点,并判断是否已过期
- 全程只用
java.time类,不用任何第三方库
跑通这个,你就真正跨过了日期时间的门槛。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











