28 9月 2011

好用的Java Date Library -- Joda Time

Java裡提供的Calendar 與 Date在實用上實在有許多不方便的地方,這點我想有異議的人應該不多,所以大部份的開發團隊都會有一些DateUtils來補足常用的日期操作。

例如像是
int getCurrentMonth(Calendar date); #Java Calendar的月份是從0開始....
boolean isBetween(Date begin, Date end);
boolean isBefore(Date source, Date target);
Calendar addDay(Calendar source, int days); #日期計算
String format(SimpleDateFormat sdf); #轉換日期格式

總歸一下大約是有下列幾種的需求

  1. 基本資訊的取得,例如年,月,日,星期幾等資訊
  2. 格式轉換,包換顯示日期字串的格式與反向將字串轉為日期物件
  3. 日期間的比較
  4. 日期計算,例如減個2天,加個1個月

自已寫也不是什麼困難的事,比起寫出ThreadSafe 的Collection算是小菜了。
但這兩天發現了一個Library -- Joda Time (http://joda-time.sourceforge.net/index.html),試用後覺得真的不錯!(好像有點後知後覺)
在jsr310沒有進入JDK前,我想Joda Time是個不錯的選擇。

用maven的朋友可以利用下列設定將joda time加入project裡
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.0</version>
</dependency>

再介紹Joda Time的用法

基本上Joda Time的DateTime就同於Java的Calendar,所以建立instance的方法也近於Calendar
DateTime dt = new DateTime();
DateTime dt = new DateTime(2011, 9, 11, 12, 0, 0, 0);

基本資訊就以get的方式來取得
int month = dt.getMonthOfYear(); #這個月份比較符合一般的習慣
int year = dt.getYear();

日期的推算,就用plus(), minus()來操作,
dt.plusMonths(2);
dt.minusDays(1);

也可用Period或Duration的方式來做。
dt.plus(Duration.standardDays(1));
dt.minus(Period.months(2));

日期的比較就以isXXX()來操作
dt.isBefore(target);
dt.isAfter(target);

格式的轉換就以dt.toString(DateTimeFormatter);

順帶一提,joda time還提供了Hibernate與Jsp tag的支援,整體上算是相當方便的工具程式了。