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

Java 8 新日期時間 API (java.time) 20 個實戰示例全掌握

     編輯:Java 相關知識

為什麼要新 API?

舊 API (java.util.Date, Calendar, SimpleDateFormat) 痛點:可變、非線程安全、月份從 0 開始、年份從 1900 起、時區處理混亂。Java 8 引入 java.time 包,**不可變、線程安全、領域模型清晰** (Instant, LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Duration, Period)。

核心類速覽

類用途例子
Instant時間戳 (UTC)2024-01-14T08:30:00Z
LocalDate無時間日期2024-01-14
LocalTime無日期時間16:30:00.123
LocalDateTime日期時間 (無時區)2024-01-14T16:30:00.123
ZonedDateTime帶時區完整時間2024-01-14T16:30+08:00[Asia/Shanghai]
Duration時間間隔 (秒/納秒)PT2H30M
Period日期間隔 (年/月/日)P1Y2M10D

20 個實戰示例

1. 獲取當前日期

LocalDate today = LocalDate.now(); // 2024-01-14

2. 解析年月日

int year = today.getYear(); // 2024
int month = today.getMonthValue(); // 1
int day = today.getDayOfMonth(); // 14

3. 創建指定日期

LocalDate birth = LocalDate.of(2010, 1, 14); // 無月份 0 陷阱

4. 日期比較

if (today.equals(birth)) System.out.println("生日快樂!");

5. 判斷週期性事件 (生日/周年)

MonthDay birthMd = MonthDay.from(birth);
if (MonthDay.from(today).equals(birthMd)) System.out.println("Happy Birthday!");

6. 獲取當前時間

LocalTime now = LocalTime.now(); // 16:33:33.369

7. 時間加減 (不可變,需接收返回值)

LocalTime later = now.plusHours(2); // 18:33:33.369

8. 日期加減周/月/年

LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); // 2024-01-21
LocalDate nextMonth = today.plusMonths(1);

9. 前後一年

LocalDate lastYear = today.minus(1, ChronoUnit.YEARS);
LocalDate nextYear = today.plusYears(1);

10. Clock 時鐘 (可注入、可測試)

Clock clock = Clock.system(ZoneId.of("Asia/Shanghai"));
LocalDate now = LocalDate.now(clock);

11. 日期前後判斷

LocalDate tomorrow = today.plusDays(1);
if (tomorrow.isAfter(today)) System.out.println("明天在今天之後");

12. 時區轉換

ZoneId ny = ZoneId.of("America/New_York");
ZonedDateTime zdt = ZonedDateTime.now(ny); // 紐約當前時間

13. YearMonth (信用卡過期/月度結算)

YearMonth ym = YearMonth.of(2025, 2);
int days = ym.lengthOfMonth(); // 28 或 29,自動判斷閏年

14. 判斷閏年

if (today.isLeapYear()) System.out.println("閏年");

15. 兩日期間隔 (Period/Duration)

Period p = Period.between(today, LocalDate.of(2024, 3, 14));
System.out.println(p.getMonths()); // 2 月

16. 偏移時間 OffsetDateTime

OffsetDateTime odt = LocalDateTime.of(2024,1,14,19,30)
    .atOffset(ZoneOffset.of("+05:30")); // 印度時間

17. Instant 時間戳

Instant now = Instant.now(); // 2024-01-14T08:33:33.379Z
Date legacy = Date.from(now); // 舊 API 互轉

18. 預定義格式化解析

LocalDate d = LocalDate.parse("20240116", DateTimeFormatter.BASIC_ISO_DATE);

19. 自定義格式化解析

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMM dd yyyy");
LocalDate holiday = LocalDate.parse("Apr 18 2024", fmt);

20. 日期時間格式化輸出字符串

String formatted = LocalDateTime.now().format(
    DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a")); // Jan 14 2024 04:33 PM

關鍵最佳實踐

  • 優先使用 LocalDate/LocalTime/LocalDateTime,無時區業務勿用 ZonedDateTime。
  • DateTimeFormatter 線程安全,可定義為 static final 常量複用。
  • 格式化模式區分大小寫:MM月 mm分,HH24時 hh12時。
  • 單位測試覆蓋邊界:閏年、月末、夏令時切換、時區跨越。

新 API 將時間領域知識內化為類設計,用好它,告別時間處理噩夢!

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