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

Joda-Time 實戰指南:告別 JDK Date/Calendar 的痛苦,擁抱優雅的時間處理

     編輯:Java 綜合教學

前言:為什麼需要 Joda-Time?

JDK Date/Calendar 設計缺陷眾多:可變、線程不安全、API 反人類(月份 0-11)、無時間段計算類。Joda-Time 作為業界標準替代品(Java 8 前),API 設計優雅、不可變、線程安全、功能豐富。Java 8 java.time 包即基於其設計。

核心類對照表

Joda-TimeJDK 對應說明
InstantDate時間線上的瞬間(毫秒值)
DateTimeCalendar完整日期時間(年歷)
DateTimeZoneTimeZone時區
DateTimeFormatterDateFormat格式化/解析
LocalDate/LocalTime無純日期/純時間(無時區)
Period/Duration無時間段(年月日/毫秒級)

核心優勢:不可變 + 流暢接口

所有核心類均為 不可變,修改操作返回新對象,支持鏈式調用(流暢接口),代碼極其簡潔。

常用場景代碼速查

1. 創建對象

DateTime now = new DateTime();                              // 當前
DateTime dt = new DateTime(2016, 8, 18, 15, 20, 47, 345); // 指定年月日時分秒毫秒

2. 獲取日歷字段(符合直覺,均從 1 開始)

dt.getYear();           // 2016
dt.getMonthOfYear();    // 8
dt.getDayOfMonth();     // 18
dt.getHourOfDay();      // 15
dt.getMinuteOfHour();   // 20
dt.getSecondOfMinute(); // 47
dt.getMillisOfSecond(); // 345
dt.getDayOfWeek();      // 4 (周四)

3. 格式化與解析

// 直接 toString
dt.toString("yyyy-MM-dd HH:mm:ss");  // 2016-08-18 15:20:47

// 專用格式化器(線程安全,可復用)
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
fmt.print(dt);           // 格式化
fmt.parseDateTime(str);  // 解析

4. 修改時間(鏈式調用,返回新對象)

// 絕對設置
dt = dt.withHourOfDay(15).withMinuteOfHour(20);

// 相對增減
dt = new DateTime().plusHours(3).plusMinutes(5);

// 今天 0 點
dt = new DateTime().withMillisOfDay(0);

// 下周二上午 10 點
dt = new DateTime().plusWeeks(1).withDayOfWeek(2).withMillisOfDay(0).withHourOfDay(10);

// 明天最後一刻
dt = new DateTime().plusDays(1).millisOfDay().withMaximumValue(); // 23:59:59.999

// 本月最後一天最後一刻
dt = new DateTime().dayOfMonth().withMaximumValue().millisOfDay().withMaximumValue();

5. 時間段計算(JDK 完全缺失的能力)

// 兩時間差(年月日時分秒)
Period p = new Period(start, end);
p.getMonths() + "月" + p.getDays() + "天" + p.getHours() + "時" + p.getMinutes() + "分";

// 專用單位類
int age = Years.yearsBetween(born, DateTime.now()).getYears();           // 年齡
int lateMin = Minutes.minutesBetween(LocalTime.now().withHourOfDay(9), LocalTime.now()).getMinutes(); // 遲到分鐘

6. 純日期/純時間類


LocalDate born = new LocalDate(1990, 11, 20);
int age = Years.yearsBetween(born, LocalDate.now()).getYears();

int lateMin = Minutes.minutesBetween(new LocalTime(9,0), LocalTime.now()).getMinutes();

7. 與 JDK 互操作


// JDK -> Joda
new DateTime(new Date());
new DateTime(Calendar.getInstance());
LocalDate.fromDateFields(new Date());

// Joda -> JDK
dt.toDate();
dt.toCalendar(Locale.CHINA);
localDate.toDate();

設計思想啟示

  • 關注點分離:工廠類 (DateTimeFormat) 單獨負責創建格式化器。
  • 流暢接口:鏈式調用讓代碼像句子一樣可讀。
  • 不可變性:線程安全,無副作用,易於推理。
  • 領域建模:LocalDate/LocalTime/Period/Duration 精準對應業務概念。

總結

Joda-Time 是 Java 時間處理的「正確姿勢」。Java 8+ 專案請直接使用 java.time(API 幾乎一致),舊專案引入 Joda-Time 即可徹底解決日期時間痛點。

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