Java 8+ 推荐使用 java.time 包五大核心类:LocalDate、LocalTime、LocalDateTime、Instant 和 ZonedDateTime;格式化解析统一用 DateTimeFormatter;所有类不可变,时间运算是生成新对象;时区处理关键为 atZone() 和 toInstant()。

直接聚焦 Java 8+ 的 java.time 包,放弃 Date/Calendar/DateFormat 这套旧体系——2026 年的新项目里它们已基本退出舞台。
只盯五个核心类,别被名字吓住
不用全背,先拿下最常用、逻辑最清晰的五个:
- LocalDate:只有年月日,比如“2026-10-08”,适合生日、合同截止日、数据库 date 字段
- LocalTime:只有时分秒(甚至纳秒),比如“18:54:30.123”,适合营业时间、定时任务触发点
- LocalDateTime:日期 + 时间合体,比如“2026-10-08T18:54:30”,对应数据库 datetime 或日常业务中的“某个时刻”
- Instant:纯时间戳,基于 UTC,精确到纳秒,适合记录日志、计算耗时、存数据库 timestamp
- ZonedDateTime:带时区的完整时间,比如“2026-10-08T18:54:30+08:00[Asia/Shanghai]”,跨国系统、用户本地时间展示必须用它
格式化和解析只靠 DateTimeFormatter
不再碰线程不安全的 SimpleDateFormat。记住一个习惯:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 固定格式用预设常量:
DateTimeFormatter.ISO_LOCAL_DATE、DateTimeFormatter.ISO_LOCAL_DATE_TIME - 自定义格式用 pattern:
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") - 格式化:调
.format()方法,传入日期对象 → 得字符串 - 解析:调
.parse()方法,传入字符串和 formatter → 得日期对象
时间运算不是“改”,而是“算出新对象”
所有 java.time 类都是不可变的,这点必须刻进本能:
立即学习“Java免费学习笔记(深入)”;
-
now.plusDays(3)不会改变 now,而是返回一个三天后的新LocalDateTime - 想加减年月日,用
plusYears()、minusMonths()、plusDays() - 想算两个时间差,区分清楚:
Duration(用于 Instant/LocalTime,单位是秒/纳秒)和Period(用于 LocalDate,单位是年/月/日)
时区处理记住两个关键动作
多数人卡在时区,其实就两步:
- 从本地时间转带时区时间:
localDateTime.atZone(ZoneId.of("Asia/Shanghai")) - 从带时区时间转 UTC 时间戳:
zonedDateTime.toInstant() - 跨时区比较或存储,一律先转成
Instant;面向用户展示,再用ZonedDateTime.withZoneSameInstant(ZoneId)转回目标时区

















