舊 java.util.Date 存在線程不安全、設計混亂(年份從 1900 起、月份 0-11)、時區處理痛苦等缺陷。Java 8 引入 java.time 包,遵循三大設計原則:
plusDays、isLeapYear)。| 類 | 含義 | 常用方法示例 |
|---|---|---|
| LocalDate | 無時區日期 (yyyy-MM-dd) | now()、plusDays(2)、getMonth()、lengthOfMonth() |
| LocalTime | 無時區時間 (HH:mm:ss.nnn) | now()、plusHours(3)、getHour()、truncatedTo(ChronoUnit.MINUTES) |
| LocalDateTime | 無時區日期時間 | now()、toLocalDate()、atZone(ZoneId) |
| ZonedDateTime | 帶時區日期時間 | now(ZoneId)、withZoneSameInstant() |
| Instant | 時間戳 (UTC) | now()、toEpochMilli()、plusSeconds() |
| Duration | 時間間隔 (精確到納秒) | between(t1,t2)、toHours()、getSeconds() |
| Period | 日期間隔 (年/月/日) | between(d1,d2)、getYears()、getMonths() |
LocalDate today = LocalDate.now();
System.out.println("今天: " + today); // 2024-05-20
System.out.println("本月天數: " + today.lengthOfMonth()); // 31
System.out.println("月份名: " + today.getMonth()); // MAY
System.out.println("後天: " + today.plusDays(2)); // 2024-05-22
System.out.println("前天: " + today.minusDays(2)); // 2024-05-18
System.out.println("解析字符串: " + LocalDate.parse("2024-12-25")); // 2024-12-25
LocalTime now = LocalTime.now();
System.out.println("當前時間: " + now); // 14:30:45.123
System.out.println("3 小時後: " + now.plusHours(3)); // 17:30:45.123
System.out.println("6 分鐘後: " + now.plusMinutes(6)); // 14:36:45.123
LocalDateTime dt = LocalDateTime.now();
ZoneId shanghai = ZoneId.of("Asia/Shanghai");
ZonedDateTime zdt = dt.atZone(shanghai); // 加上時區
Instant instant = zdt.toInstant(); // 轉 UTC 時間戳
System.out.println("毫秒數: " + instant.toEpochMilli());
LocalDate start = LocalDate.of(2024, 1, 1);
LocalDate end = LocalDate.of(2024, 5, 20);
Period p = Period.between(start, end);
System.out.printf("相差 %d 年 %d 月 %d 天%n", p.getYears(), p.getMonths(), p.getDays());
// 輸出: 相差 0 年 4 月 19 天
Duration d = Duration.between(LocalTime.of(9, 0), LocalTime.of(17, 30));
System.out.println("工作時長(分鐘): " + d.toMinutes()); // 510
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm");
String str = LocalDateTime.now().format(fmt); // 2024年05月20日 14:30
LocalDateTime parsed = LocalDateTime.parse("2024-05-20T14:30", DateTimeFormatter.ISO_LOCAL_DATE_TIME);
plus/minus/with 方法均返回新對象,原對象不變。ZonedDateTime,切勿用 LocalDateTime 直接存儲。Serializable,Jackson 等庫需註冊 JavaTimeModule。Java 8 日期時間 API 以不可變、領域驅動、關注點分離為核心,徹底解決舊 API 歷史包袱。掌握 LocalDate/LocalTime/LocalDateTime 三大核心類及 Period/Duration 間隔計算,配合 DateTimeFormatter 格式化,即可優雅處理 99% 業務場景。