新日期时间 API(LocalDate / DateTimeFormatter)
Java 8 之前,Date 和 Calendar 是所有 Java 开发者的噩梦。又绕又线程不安全,月份从 0 开始算...
我当年写代码处理日期时间时,总是需要 google "Java 获取当前日期的三种方法",因为记不住那些 API。
Java 8 引入的 java.time 包,终于把这个痛点解决了。今天我们就来彻底掌握这套新 API。
一、为什么要用新 API
1.1 Date 和 Calendar 的问题
1.2 java.time 的优势
二、核心类型
2.1 Instant:时间戳
2.2 LocalDate:日期
2.3 LocalTime:时间
2.4 LocalDateTime:日期时间
2.5 ZonedDateTime:带时区
三、Duration 和 Period
3.1 Duration:时间差(基于时间)
3.2 Period:时间差(基于日期)
3.3 Duration vs Period
四、DateTimeFormatter:格式化
4.1 内置格式
4.2 自定义格式
4.3 格式模式字母
4.4 带时区的格式化
4.5 解析
五、【直观类比】
【直观类比】
新日期时间 API 的四个核心类型:
六、生产避坑
6.1 ❌ 错误示范:混淆 LocalDateTime 和 ZonedDateTime
6.2 ❌ 错误示范:跨年/跨月计算错误
6.3 ❌ 错误示范:使用 SimpleDateFormat
七、实战案例
7.1 计算两个日期之间的天数
7.2 判断日期是否在范围内
7.3 获取本月第一天/最后一天
八、面试追问链
第一层:基础用法
面试官问:"LocalDate、LocalTime、LocalDateTime 有什么区别?"
LocalDate 只有日期(年月日),LocalTime 只有时间(时分秒),LocalDateTime 是两者组合。都不带时区信息,适合表示本地时间。
第二层:时区处理
面试官追问:"ZonedDateTime 和 LocalDateTime 的区别是什么?"
LocalDateTime 不带时区,是"日历上的时间";ZonedDateTime 带时区,是"某个时区的具体时间"。存储到数据库或传输时应该用 ZonedDateTime 或 Instant,避免时区丢失。
第三层:格式化
面试官追问:"DateTimeFormatter 怎么用?为什么比 SimpleDateFormat 好?"
DateTimeFormatter 使用 ofPattern() 创建格式化器,format() 格式化日期,parse() 解析字符串。它是线程安全的,而 SimpleDateFormat 不是。
【学习小结】
- Instant:时间戳,适合存储和计算
- LocalDate:日期,LocalTime:时间,LocalDateTime:两者组合
- ZonedDateTime:带时区,Instant:UTC 时间戳
- Duration:时间差(秒),Period:日期差(年月日)
- DateTimeFormatter:格式化,线程安全
- 不要混淆 LocalDateTime 和 ZonedDateTime