Joda-time學習筆記

1、joda的優勢展現

joda-time可以便捷地格式化時間輸出、設定時間、加減時間、計算時間差值。跟JDK的Date/Calender相比一試便知,每一個測試中上半部分是用jdk操做,下半部是用joda-time操做。最後一個我想……實在不想用jdk來實現:html

public class JodaTimeTest {
    @Test
    public void testPrintDate(){
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateText = format.format(date);
        Assert.assertEquals("2014-11-13", dateText);

        DateTime dateTime = new DateTime();
        dateText = dateTime.toString("yyyy-MM-dd");
        Assert.assertEquals("2014-11-13", dateText);
    }

    @Test
    public void testAddDate(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(2008, Calendar.AUGUST, 8, 0, 0, 0);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
        calendar.add(Calendar.DAY_OF_MONTH, 90);
        String dateText = sdf.format(calendar.getTime());
        Assert.assertEquals("2008年11月06日 星期四 00:00:00", dateText);

        DateTime dateTime = new DateTime(2008,8, 8, 0, 0, 0, 0);
        dateText = dateTime.plusDays(90).toString("yyyy年MM月dd日 E HH:mm:ss");
        Assert.assertEquals("2008年11月06日 星期四 00:00:00", dateText);
    }

    @Test
    public void testCalcDate(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(2012, Calendar.DECEMBER, 20, 0, 0, 0);
        calendar.add(Calendar.YEAR, 9);
        calendar.add(Calendar.MONTH, 5);
        calendar.add(Calendar.WEEK_OF_MONTH, 2);
        calendar.add(Calendar.DAY_OF_MONTH, 7);
        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 E");
        String dateText = df.format(calendar.getTime());
        Assert.assertEquals("2022年06月10日 星期五", dateText);

        LocalDate birthDate = new LocalDate(2012, 12, 20);
        dateText = birthDate.plusYears(9).plusMonths(5).plusWeeks(2).plusDays(7).toString("yyyy年MM月dd日 E");
        Assert.assertEquals("2022年06月10日 星期五", dateText);
    }

    @Test
    public void testSomeDate(){;
        LocalDate date = new LocalDate(1990, 10, 24);
        int days = Days.daysBetween(date, new LocalDate()).getDays();
        Assert.assertEquals(8786, days);
    }
}

這三個是比較常見的操做,另外還能夠用來計算本週是第幾周、某天是星期幾(我在生產環境中已使用的接口)等,其餘api你們能夠參考官網。java

2、joda與long、Date、Calendar互轉

與三者的互轉十分簡便,因此joda-time徹底能夠取代jdk中日期來運算,只要就結果再轉換就行。api

public class JodaTurnTest {
    @Test
    public void testJoda2Long(){
        long time =  1415861538986L;
        DateTime date = new DateTime(time);
        Assert.assertEquals(time, date.getMillis());  //將時間粒度鎖定在秒級別
    }

    @Test
    public void  testJoda2Date(){
        Date dateSource = new Date();
        DateTime dateTime = new DateTime(dateSource);

        Assert.assertEquals(dateSource.getTime(), dateTime.getMillis());

        Date date2 = dateTime.toDate();
        Assert.assertEquals(dateSource, date2);
    }

    @Test
    public void testJoda2Calender(){
        Calendar cal = Calendar.getInstance();
        DateTime dateTime = new DateTime(cal);

        Assert.assertEquals(cal.getTimeInMillis(), dateTime.getMillis());

        Calendar calendar = dateTime.toGregorianCalendar();
        Assert.assertEquals(cal, calendar);
    }
}

三 、joda的概念


Instant:連續時間軸上的某個瞬間,即某時刻,採用UTC 1970年1月1日 00:00:00到目前時刻經歷的毫秒數。與unix和jdk中的相同。 joda-time中主類Datetime就採用了Instant,這樣就能夠與JDK中date,calender交互了。測試

  joda1 


Partial:平常生活中的時間點,只是一個時間片斷,如11點20分,再如9月20號。 Joda-timeAPI中LocalDate、LocalTime、LocalDateTime、YearMonth、MonthDay、Partial、YearMonthDay、TimeOfDay類都是這種概念。 joda2 .net


Interval:表達的是兩個時刻之間的區間段。如: unix

joda3

DateTime start = new DateTime(2004, 1, 1, 0, 0, 0, 0);
DateTime end = new DateTime(2005, 1, 1, 0, 0, 0, 0);
Interval interval = new Interval(start, end);


在Interval類接口中,能夠獲得開始、結束、是否包含等等code

DateTime start = interval.getStart();
DateTime end = interval.getEnd();
DateTime testDate = new DateTime(2004, 2, 1, 0, 0, 0, 0);
boolean contains = interval.contains(testDate);


Duration:表示的目前的時刻再持續多久時間,與以前的Interval時間區間該概念相似,不過單位是毫秒。 joda4 orm

DateTime start = new DateTime(1975, 5, 26, 0, 0, 0);
Duration oneThousandMillis = new Duration(1000);
DateTime end = start.plus(oneThousandMillis);


Period:與uration概念相似,不過單位不是毫秒,而是更人性化的單位,如年、月、日。這類的包括Period、MutablePeriod、Years、Months、Weeks、Days Hours、Minutes、Seconds等類。 htm

joda5

DateTime start = new DateTime(1975, 5, 26, 0, 0, 0);
DateTime end = new DateTime(1978, 7, 23, 0, 0, 0);
Days days = Days.daysBetween(start, end);

4、joda與java8與date4j

java8中提供了新的日期API,而提供者正是Joda。可查看JSR310( https://jcp.org/en/jsr/detail?id=310)。 接口

date4j是針對joda龐大類系與年表體系,而提供一套極簡Api, 可查看( http://www.date4j.net/)。比較遺憾暫時尚未發現中國農曆操做的api。

5、參考地址:

ibm上的簡介: http://www.ibm.com/developerworks/cn/java/j-jodatime.html 

臺灣一哥們寫的,本文圖片都是來着他的bolg: http://www.codedata.com.tw/java/jodatime-jsr310-3-using-jodatime/ 

官網: http://www.joda.org/joda-time/

相關文章
相關標籤/搜索