爲何要使用 Joda?考慮建立一個用時間表示的某個隨意的時刻 — 好比,2000 年 1 月 1 日 0 時 0 分。我如何建立一個用時間表示這個瞬間的 JDK 對象?使用 java.util.Date
?事實上這是行不通的,由於自 JDK 1.1 以後的每一個 Java 版本的 Javadoc 都聲明應當使用 java.util.Calendar
。Date
中不同意使用的構造函數的數量嚴重限制了您建立此類對象的途徑。java
然而,Date
確實有一個構造函數,您能夠用來建立用時間表示某個瞬間的對象(除 「如今」 之外)。該方法使用距離 1970 年 1 月 1 日子時格林威治標準時間(也稱爲 epoch)以來的毫秒數做爲一個參數,對時區進行校訂。考慮到 Y2K 對軟件開發企業的重要性,您可能會認爲我已經記住了這個值 — 可是我沒有。Date
也不過如此。函數
那麼 Calendar
又如何呢?我將使用下面的方式建立必需的實例:spa
Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
使用 Joda,代碼應該相似以下所示:code
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
這一行簡單代碼沒有太大的區別。可是如今我將使問題稍微複雜化。假設我但願在這個日期上加上 90 天並輸出結果。使用 JDK,我須要使用清單 1 中的代碼:orm
清單 1. 以 JDK 的方式向某一個瞬間加上 90 天並輸出結果對象
Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0); SimpleDateFormat sdf = new SimpleDateFormat("E MM/dd/yyyy HH:mm:ss.SSS"); calendar.add(Calendar.DAY_OF_MONTH, 90); System.out.println(sdf.format(calendar.getTime()));
使用 Joda,代碼如清單 2 所示:開發
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS");
二者之間的差距拉大了(Joda 用了兩行代碼,JDK 則是 5 行代碼)。get
如今假設我但願輸出這樣一個日期:距離 Y2K 45 天以後的某天在下一個月的當前周的最後一天的日期。坦白地說,我甚至不想使用 Calendar
處理這個問題。使用 JDK 實在太痛苦了,即便是簡單的日期計算,好比上面這個計算。正是多年前的這樣一個時刻,我第一次領略到 Joda-Time 的強大。it
……form