企業應用頻繁處理日期,保險行業更要求精確計算。java.util.Calendar 用起來麻煩,Joda-Time 作為替代庫,設計目標:易用、可擴展、功能全、支持多種日曆系統、與 JDK 100% 互操作。
創建 2000-01-01 00:00:00:
Calendar c = Calendar.getInstance(); c.set(2000, Calendar.JANUARY, 1, 0, 0, 0);DateTime dt = new DateTime(2000, 1, 1, 0, 0, 0, 0);加 90 天並輸出:
SimpleDateFormatdt.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS")複雜計算「Y2K 45 天后下個月當前周最後一天」:
new DateTime(2000,1,1,0,0,0,0)
.plusDays(45).plusMonths(1).dayOfWeek().withMaximumValue()
.toString("E MM/dd/yyyy HH:mm:ss.SSS")
// 輸出:Sun 03/19/2000 00:00:00.000
DateTimeZone 封裝地理位置DateTime:毫秒精度瞬間,最常用DateMidnight:特定日期午夜LocalDate:年月日,無時區LocalTime:一天中的時間Duration:毫秒級精確跨度Period:年月周等人類單位跨度Interval:有明確起止的半開區間構造方式:系統時間、字段值、毫秒數、其他對象、字符串(ISO 格式)。
屬性如 dayOfMonth()、monthOfYear()、dayOfWeek() 等,支持 withMaximumValue()、setCopy()、plusDays() 等鏈式調用,不可變模式同 String。
Calendar cal = dt.toCalendar(Locale.getDefault());
Date date = dt.toDate();
// LocalDate 需轉 DateMidnight 再 toDate()
直接 toString() 傳入 ISO-8601 或 JDK 兼容格式字符串,無需創建 SimpleDateFormat:
dt.toString("MM/dd/yyyy HH:mm:ss.SSSa")
dt.toString(ISODateTimeFormat.basicDateTime())
Joda-Time 讓日期計算、打印、解析變得高效愉快。衍生項目:Grails 插件、joda-time-jpox(DataNucleus 持久化)、Goda-Time(GWT 移植,許可問題暫停)。