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

Joda-Time 入門:既然無法擺脫時間,為何不簡化時間處理?

     編輯:Java 相關知識

企業應用頻繁處理日期,保險行業更要求精確計算。java.util.Calendar 用起來麻煩,Joda-Time 作為替代庫,設計目標:易用、可擴展、功能全、支持多種日曆系統、與 JDK 100% 互操作。

為什麼選 Joda-Time?

創建 2000-01-01 00:00:00:

  • JDK:Calendar c = Calendar.getInstance(); c.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
  • Joda:DateTime dt = new DateTime(2000, 1, 1, 0, 0, 0, 0);

加 90 天並輸出:

  • JDK 5 行代碼需 SimpleDateFormat
  • Joda 2 行:dt.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

核心概念

  • 不可變性:所有類不可變,線程安全,操作返回新實例
  • 瞬間性:相對 epoch 的毫秒數,與 JDK 兼容
  • 局部性:時間片段(如月日、一天中的時間),可重複應用
  • 年表:日曆系統(ISO、Coptic、Julian、Islamic 等 8 種)
  • 時區:DateTimeZone 封裝地理位置

關鍵類與創建

  • DateTime:毫秒精度瞬間,最常用
  • DateMidnight:特定日期午夜
  • LocalDate:年月日,無時區
  • LocalTime:一天中的時間
  • Duration:毫秒級精確跨度
  • Period:年月周等人類單位跨度
  • Interval:有明確起止的半開區間

構造方式:系統時間、字段值、毫秒數、其他對象、字符串(ISO 格式)。

鏈式計算與屬性訪問

屬性如 dayOfMonth()、monthOfYear()、dayOfWeek() 等,支持 withMaximumValue()、setCopy()、plusDays() 等鏈式調用,不可變模式同 String。

JDK 互操作

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 移植,許可問題暫停)。

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