Z
ZHANK
核心类库

日期与时间 API

掌握 java.time 包、LocalDate/Time、格式化、时区

日期与时间 API

Java 8 之前的 DateCalendar 设计糟糕(可变、月份从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"));