Java第三方庫JodaTime的具體使用
Java8之前的時間庫中存在一些設計不好的地方,導致用起來非常地不方便,又容易出錯。比如,要實現(xiàn)在指定的日期的基礎上面增加指定的時間的操作,你需要些大量的樣板代碼;而它的月份從0開始,稍有不慎就會掉入坑中。所以,通常我們使用第三方庫Joda Time來進行時間相關的操作。
1、使用JodaTime
JodaTime在Github上面的主頁:JodaTime
使用JodaTime的時候的兩種配置方式:
在Maven中:
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency>
在Gradle中:
compile 'joda-time:joda-time:2.9.9'
核心類
使用最多的五個日期時間類:
- Instant - 不可變的類,用來表示時間軸上一個瞬時的點(時間戳)
- DateTime - 不可變的類,用來替換JDK的Calendar類
LocalDate - 不可變的類,表示一個本地的日期,而不包含時間部分(沒有時區(qū)信息)
- LocalTime - 不可變的類,表示一個本地的時間,而不包含日期部分(沒有時區(qū)信息)
- LocalDateTime - 不可變的類,表示一個本地的日期-時間(沒有時區(qū)信息)
2、獲取DateTime實例
當使用JodaTime的時候,首先你要獲取一個DateTime實例,然后用它的其他方法串聯(lián)起來實現(xiàn)強大的功能。想要獲取一個DateTime實例,你有很多種方式。下面列出常見的幾種方式:
方式1:使用系統(tǒng)時間構造DateTime實例
DateTime dateTime = new DateTime();
方式2:使用具體的時間構造DateTime實例,該方法有許多重載版本
DateTime dateTime1 = new DateTime( 2000, // year 1, // month 1, // day 0, // hour (midnight is zero) 0, // minute 0, // second 0 // milliseconds );
方式3:使用Calendar構造DateTime實例
DateTime dateTime2 = new DateTime(Calendar.getInstance());
方式4:使用其他DateTime實例構造DateTime實例
DateTime dateTime3 = new DateTime(dateTime);
方式5:使用字符串構造DateTime實例
DateTime dateTime4 = new DateTime("2006-01-26T13:30:00-06:00"); DateTime dateTime5 = new DateTime("2006-01-26");
3、使用DateTime的方法
DateTime中有許多的方法,這里我們將常用的方法分成兩類。一類是在方法中返回DateTime的那種,一類是在方法中返回Property類型的那種。顯然,后面的那種繼續(xù)串聯(lián)操作的話,就需要調用Property的實例方法了。
這里,我們先給出DateTime中的第一類方法。
// 指定的時間單位上面增加指定的值 DateTime dateTime0 = dateTime.plusDays(1); System.out.println(dateTime0); // 指定的時間單位上面減少指定的值 DateTime dateTime6 = dateTime.minusDays(1); System.out.println(dateTime6); // 除了增減日期還可以直接指定它的指定時間單位上面的值 DateTime dateTime7 = dateTime.withYear(2020); System.out.println(dateTime7); // 按照指定的格式輸出日期 System.out.println(dateTime.toString("E MM/dd/yyyy HH:mm:ss.SSS"));
在上面的代碼中,我們只給出了其中的一部分方法的實例。實際上,在DateTime內(nèi)部有許多的方法,只是它們的原理基本類似。
上面的一些方法,如果涉及的時間發(fā)生了變化(具體是指時間對應的毫秒數(shù)發(fā)生了變化),就會調用DateTime實例的withMillis()方法。在該方法中,如果發(fā)現(xiàn)傳入的毫秒數(shù)與當前的毫秒數(shù)不一樣就會新建一個DateTime實例,并將其返回。所以,上面的plusDays(1)和minusDays(1)返回的DateTime實際上已經(jīng)是另一個實例了。
4、使用Property的
可以通過DateTime實例的millisOfDay() dayOfYear() minuteOfDay()等一些列方法可以獲取到該DateTime的一個Property實例,然后可以通過調用Property的方法再獲取一個DateTime實例。也就是說,實際上調用DateTime的方法獲取Property實例是為了對指定的時間位置的信息進行修改。比如,對“日”進行修改,對“年”進行修改等等。修改了之后還是要獲取一個DateTime實例,然后再繼續(xù)進行后續(xù)的操作。
實際上每次調用DateTime的方法獲取Property實例的時候,都會將當前的DateTime作為參數(shù)傳入。然后當調用了指定的方法之后又會調用DateTime實例的withMillis()方法判斷時間是否發(fā)生變化,如果發(fā)生了變化就創(chuàng)建一個新實例并返回。
下面是它的一些示例:
// 這里先用dayOfMonth獲取一個Property實例,然后調用它的withMaximumValue方法 // 它的含義是指定日期的其他日期不變,月份變成最大的之后返回一個DateTime,即如果傳入的是2018年5月1日,將返回2018年5月31日, // 年,月,秒等位置不變,日變成該月最大的。 DateTime dateTime0 = dateTime.dayOfMonth().withMaximumValue(); DateTime dateTime1 = dateTime.dayOfMonth().withMinimumValue();
5、其他的靜態(tài)方法
除了上面的一些類之外,JodaTime還有許多的靜態(tài)方法供我們使用。比如:
System.out.println(Days.daysBetween(dateTime1, dateTime).getDays()); System.out.println(Months.monthsBetween(dateTime1, dateTime).getMonths()); System.out.println(Years.yearsBetween(dateTime1, dateTime).getYears());
當然,這里我們只列出了對兩個DateTime實例的“日” “月”和“年”單位的操作,還有許多類似的類可以用來對“毫秒”“秒”等操作。
結語
這里只是通過JodaTime的一些常用的方法的實例來說明其設計的基本原理,重點在于理清其中的邏輯,明白每個被串聯(lián)的操作究竟做了什么。
相關代碼:Java-advanced
到此這篇關于Java第三方庫JodaTime的具體使用的文章就介紹到這了,更多相關Java JodaTime 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
centos下GitLab+Jenkins持續(xù)集成環(huán)境搭建(安裝jenkins)
這篇文章主要為大家詳細介紹了centos下搭建GitLab+Jenkins持續(xù)集成環(huán)境,安裝jenkins的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04volatile與happens-before的關系與內(nèi)存一致性錯誤
本文講了Java并發(fā)編程中volatile變量、happens-before與內(nèi)存一致性錯誤,下面來和小編一起學習下如何解決2019-05-05springboot?vue接口測試定義編輯功能的實現(xiàn)
這篇文章主要為大家介紹了springboot?vue接口測試定義編輯功能的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Java簡單實現(xiàn)session保存到redis的方法示例
這篇文章主要介紹了Java簡單實現(xiàn)session保存到redis的方法,結合實例形式分析了Java將session存入redis緩存服務器的相關設置、實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2018-05-05淺談Spring Data JPA與MyBatisPlus的比較
本文主要介紹了淺談Spring Data JPA 與 MyBatisPlus的比較2024-08-08