首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 8 全新日期時間 API 完全指南:LocalDate、LocalTime、Duration 與 Period

     編輯:Java 相關知識

為什麼要新 API?

舊 java.util.Date 存在線程不安全、設計混亂(年份從 1900 起、月份 0-11)、時區處理痛苦等缺陷。Java 8 引入 java.time 包,遵循三大設計原則:

  1. 不可變性:所有類均為 final、線程安全,無副作用。
  2. 領域驅動設計:類名、方法名貼近業務語義(如 plusDays、isLeapYear)。
  3. 關注點分離:日期、時間、日期時間、時區、時段分別建模。

核心類速覽

類含義常用方法示例
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()

實戰代碼示例

1. 日期操作

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

2. 時間操作

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

3. 日期時間組合與轉換

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());

4. 間隔計算

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

5. 格式化與解析

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);

避坑指南

  • Period vs Duration:日期間隔用 Period,時間/日期時間間隔用 Duration。
  • 不可變性:所有 plus/minus/with 方法均返回新對象,原對象不變。
  • 時區陷阱:跨時區業務務必使用 ZonedDateTime,切勿用 LocalDateTime 直接存儲。
  • 序列化:新類實現 Serializable,Jackson 等庫需註冊 JavaTimeModule。

總結

Java 8 日期時間 API 以不可變、領域驅動、關注點分離為核心,徹底解決舊 API 歷史包袱。掌握 LocalDate/LocalTime/LocalDateTime 三大核心類及 Period/Duration 間隔計算,配合 DateTimeFormatter 格式化,即可優雅處理 99% 業務場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved