Joda-Time時間處理


1.Joda-Time介紹

a.what?

    使用JDK完成時間的操作非常痛苦和繁瑣.Joda tme是一個面向Java平台的易於使用的開源時間/日期庫.通過使用Joda-Time我們可以輕松化解處理日期和時間的痛苦和繁瑣.

  Joda-Time 令時間和日期值變得易於管理、操作和理解。事實上,易於使用是 Joda 的主要設計目標。其他目標包括可擴展性、完整的特性集以及對多種日歷系統的支持。

  並且 Joda 與 JDK 是百分之百可互操作的,因此您無需替換所有 Java 代碼,只需要替換執行日期/時間計算的那部分代碼。

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

b.why?

考慮創建一個用時間表示的某個隨意的時刻,如2000年1月1日0時0分.

我如何創建一個用時間表示這個瞬間的 JDK 對象?使用 java.util.Date?

事實上這是行不通的,因為自 JDK 1.1 之后的每個 Java 版本的 Javadoc 都聲明應當使用 java.util.Calendar。
Date 中不贊成使用的構造函數的數量嚴重限制了您創建此類對象的途徑。

那么Calendar又如何呢?我們使用下面的方式創建必須的實列

Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);

用 Joda,代碼應該類似如下所示:

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);

這一行簡單代碼並沒有太大的區別.但是現在我們將問題稍微復雜化.

假設我們希望在這個日期上加上90天並輸出結果.使用JDK

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-time模塊

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0); System.out.println(dateTime.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS"));

在比如::距離 2000.1.1日 45 天之后的某天在下一個月的當前周的最后一天的日期。

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(45).plusMonths(1).dayOfWeek() .withMaximumValue().toString("E MM/dd/yyyy HH:mm:ss.SSS");

2.創建Joda-Time對象

//方法一:取系統時間點
DateTime dt1 = new DateTime();
System.out.println(dt1);

//方法二:通過java.util.Date對想生成
DateTime dt2 = new DateTime(new Date());
System.out.println(dt2);

//方法三:指定年月日時分秒生成
DateTime dt3 = new DateTime(2018,12,21,1,1,1);
System.out.println(dt3);

//方法四:ISO8601形式生成
DateTime dt4 = new DateTime("2012-05-20");
System.out.println(dt4);
DateTime dt5 = new DateTime("2012-05-20T13:14:00");
System.out.println(dt5);

//只需要年月日的時候
LocalDate localDate = new LocalDate(2015,12,21);
System.out.println(localDate);

//只需要十分秒毫秒的時候
LocalTime localTime = new LocalTime(12,30,26,0);
System.out.println(localDate);

3.與JDK日期對象轉換 

有時候代碼中使用的時Date與Calendar類,但是又需要一些復雜的時間日期算法,這個時候我們可以使用joda模塊,然后再轉化為代碼中Date與Calendar類.

 1 DateTime dt = new DateTime();  2         
 3 //轉換成java.util.Date對象
 4 Date d1 = new Date(dt.getMillis());  5 Date d2 = dt.toDate();  6         
 7 //轉換成java.util.Calendar對象
 8 Calendar c1 = Calendar.getInstance();  9 c1.setTimeInMillis(dt.getMillis()); 10 Calendar c2 = dt.toCalendar(Locale.getDefault());

 

4.計算日期

         DateTime dt = new DateTime(); /** * yearOfCentury * dayOfYear * monthOfYear * dayOfMonth * dayOfWeek * minusDays * plusDays * ..... */
        //得到dt這一周的最小一天
 System.out.println(dt.dayOfWeek().withMinimumValue()); //得到dt減去6個月,然后再求那個月中的最大一天
        System.out.println(dt.minusMonths(6).dayOfMonth().withMaximumValue()); DateTime yesterday = dt.minusDays(1); DateTime tomorrow = dt.plusDays(1); DateTime before1month = dt.minusMonths(1); DateTime after3month = dt.plusMonths(3); DateTime before2year = dt.minusYears(2); DateTime after5year = dt.plusYears(5); //
        int year = dt.getYear(); //
        int month = dt.getMonthOfYear(); //
        int day = dt.getDayOfMonth(); //星期 
        int week = dt.getDayOfWeek(); //
        int hour = dt.getHourOfDay(); //
        int min = dt.getMinuteOfHour(); //
        int sec = dt.getSecondOfMinute(); //毫秒 
        int msec = dt.getMillisOfSecond(); //月末日期 
        DateTime lastday = dt.dayOfMonth().withMaximumValue(); //90天后那周的周一
        DateTime firstday = dt.plusDays(90).dayOfWeek().withMinimumValue(); //計算區間天數
        DateTime begin = new DateTime("2012-01-1"); DateTime end = new DateTime("2012-11-1"); Period period = new Period(begin, end,PeriodType.days()); System.out.println(period.getDays()); //計算特殊日期是否再該區間
        Interval interval = new Interval(begin, end); boolean contained = interval.contains(new DateTime("2012-2-29")); System.out.println(contained); //日期比較
        DateTime d1 = new DateTime("2012-02-01"); DateTime d2 = new DateTime("2012-05-01"); boolean b1 = d1.isAfter(d2); System.out.println(b1); //和系統時間對比
        boolean b2 = d1.isAfterNow(); System.out.println(b2);        

 

5.格式化日期

使用 JDK 格式化日期以實現打印是完全可以的,但是我始終認為它應該更簡單一些。
這是 Joda 設計者進行了改進的另一個特性。要格式化一個 Joda 對象,調用它的 toString() 方法,
並且如果您願意的話,傳遞一個標准的 ISO8601或一個 JDK 兼容的控制字符串,以告訴 JDK 如何執行格式化。
不需要創建單獨的 SimpleDateFormat 對象
(但是 Joda 的確為那些喜歡自找麻煩的人提供了一個DateTimeFormatter 類)。
調用 Joda 對象的 toString() 方法,僅此而已。

DateTime dateTime = DateTime.now(); dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa"); dateTime.toString("dd-MM-yyyy HH:mm:ss"); dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa"); dateTime.toString("MM/dd/yyyy HH:mm ZZZZ"); dateTime.toString("MM/dd/yyyy HH:mm Z");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM