日期与时间 API
掌握 java.time 包、LocalDate/Time、格式化、时区
日期与时间 API
Java 8 之前的 Date 和 Calendar 设计糟糕(可变、月份从0开始、线程不安全),所以 Java 8 推出了全新的 java.time 包。新旧代码混用时注意区分。
学完本章你将: 掌握 LocalDate/LocalTime/LocalDateTime、格式化、时间戳。
核心类
java
LocalDate today = LocalDate.now(); // 2024-07-22(只有日期)
LocalTime now = LocalTime.now(); // 14:30:00(只有时间)
LocalDateTime dt = LocalDateTime.now(); // 2024-07-22T14:30:00(日期+时间)
三者关系: LocalDate + LocalTime = LocalDateTime。它们都是不可变对象——所有"修改"方法都返回新实例。
创建与计算
java
// 创建指定日期
LocalDate date = LocalDate.of(2024, 7, 22);
LocalDate parsed = LocalDate.parse("2024-07-22");
// 计算 —— 返回新对象,原对象不变
LocalDate nextWeek = date.plusWeeks(1); // +7天
LocalDate lastMonth = date.minusMonths(1); // -1月
LocalDate firstDay = date.withDayOfMonth(1); // 本月1号
// 比较
date.isBefore(nextWeek); // true
date.isAfter(lastMonth); // true
格式化
java
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
System.out.println(now.format(fmt)); // "2024年07月22日 14:30:00"
// 解析字符串
LocalDate d = LocalDate.parse("2024/07/22",
DateTimeFormatter.ofPattern("yyyy/MM/dd"));
Instant —— 时间戳
Instant 是 UTC 时间线上的一个瞬间(精确到纳秒),适合存数据库和跨时区传输。
java
Instant instant = Instant.now();
System.out.println(instant.getEpochSecond()); // Unix 秒数
// LocalDateTime ↔ Instant(需要时区)
LocalDateTime local = LocalDateTime.now();
Instant ins = local.toInstant(ZoneOffset.ofHours(8)); // 东八区
LocalDateTime restored = LocalDateTime.ofInstant(ins, ZoneId.of("Asia/Shanghai"));
DateTimeFormatter.ofPattern("yyyy/MM/dd"));
---
## 时间戳与转换
```java
// Instant —— 时间戳
Instant instant = Instant.now();
System.out.println(instant.getEpochSecond()); // Unix 秒数
// LocalDateTime ↔ Instant
LocalDateTime local = LocalDateTime.now();
Instant ins = local.toInstant(ZoneOffset.ofHours(8));
LocalDateTime restored = LocalDateTime.ofInstant(ins, ZoneId.of("Asia/Shanghai"));