1. 程式人生 > >強大易用的日期和時間庫 線程安全 Joda Time

強大易用的日期和時間庫 線程安全 Joda Time

class ... 進行 comment images 時間格式化 一個 ges 而且

https://www.ibm.com/developerworks/cn/java/j-jodatime.html

不可變性

我在本文討論的 Joda 類具有不可變性,因此它們的實例無法被修改。(不可變類的一個優點就是它們是線程安全的)

Joda-Time提供了一組Java類包用於處理包括ISO8601標準在內的date和time。可以利用它把JDK Date和Calendar類完全替換掉,而且仍然能夠提供很好的集成。

Joda-Time主要的特點包括:

1. 易於使用:Calendar讓獲取"正常的"的日期變得很困難,使它沒辦法提供簡單的方法,而Joda-Time能夠 直接進行訪問域並且索引值1就是代表January。

2. 易於擴展:JDK支持多日歷系統是通過Calendar的子類來實現,這樣就顯示的非常笨重而且事實 上要實現其它日歷系統是很困難的。Joda-Time支持多日歷系統是通過基於Chronology類的插件體系來實現。


3. 提供一組完整的功能:它打算提供 所有關系到date-time計算的功能.Joda-Time當前支持8種日歷系統,而且在將來還會繼續添加,有著比JDK Calendar更好的整體性能等等。

附上幾個例子:

1、創建任意時間對象

Java代碼 技術分享圖片
  1. //jdk
  2. Calendar calendar=Calendar.getInstance();
  3. calendar.set(2012, Calendar.NOVEMBER, 15, 18, 23,55);
  4. //Joda-time
  5. DateTime dateTime=new DateTime(2012, 12, 15, 18, 23,55);

2、計算兩日期相差的天數

Java代碼 技術分享圖片
  1. //jdk
  2. Calendar start = Calendar.getInstance();
  3. start.set(2012, Calendar.NOVEMBER, 14);
  4. Calendar end = Calendar.getInstance();
  5. end.set(2012, Calendar.NOVEMBER, 15);
  6. long startTim = start.getTimeInMillis();
  7. long endTim = end.getTimeInMillis();
  8. long diff = endTim-startTim;
  9. int days=(int) (diff/1000 / 3600 / 24);
  10. //joda-time
  11. LocalDate start=new LocalDate(2012, 12,14);
  12. LocalDate end=new LocalDate(2012, 12, 15);
  13. int days = Days.daysBetween(start, end).getDays();

3、獲取18天之後的某天在下個月的當前周的第一天日期

Java代碼 技術分享圖片
  1. //jdk
  2. Calendar current = Calendar.getInstance();
  3. current.add(Calendar.DAY_OF_MONTH, 18);
  4. current.add(Calendar.MONTH, 1);
  5. ......
  6. DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  7. Date date = current.getTime();
  8. String dateStr = dateFormat.format(date);
  9. System.out.println(dateStr);
  10. //joda-time
  11. String dateStr = new DateTime().plusDays(18).plusMonths(1)
  12. .dayOfWeek().withMinimumValue().toString("yyyy-MM-dd HH:mm:ss");
  13. System.out.println(dateStr);

4、時間格式化

Java代碼 技術分享圖片
  1. DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");
  2. //時間解析
  3. DateTime dateTime = DateTime.parse("2012-12-21 23:22:45", format);
  4. //時間格式化,輸出==> 2012/12/21 23:22:45 Fri
  5. String string_u = dateTime.toString("yyyy/MM/dd HH:mm:ss EE");
  6. System.out.println(string_u);
  7. //格式化帶Locale,輸出==> 2012年12月21日 23:22:45 星期五
  8. String string_c = dateTime.toString("yyyy年MM月dd日 HH:mm:ss EE",Locale.CHINESE);
  9. System.out.println(string_c);

5、與JDK互操作

Java代碼 技術分享圖片
    1. //通過jdk時間對象構造
    2. Date date = new Date();
    3. DateTime dateTime = new DateTime(date);
    4. Calendar calendar = Calendar.getInstance();
    5. dateTime = new DateTime(calendar);
    6. // Joda-time 各種操作.....
    7. dateTime = dateTime.plusDays(1) // 增加天
    8. .plusYears(1)// 增加年
    9. .plusMonths(1)// 增加月
    10. .plusWeeks(1)// 增加星期
    11. .minusMillis(1)// 減分鐘
    12. .minusHours(1)// 減小時
    13. .minusSeconds(1);// 減秒數
    14. // 計算完轉換成jdk 對象
    15. Date date2 = dateTime.toDate();
    16. Calendar calendar2 = dateTime.toCalendar(Locale.CHINA);

強大易用的日期和時間庫 線程安全 Joda Time