Java時間處理第三方包Joda?Time使用詳解
引言
Joda-Time provides a quality replacement for the Java date and time classes.
Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (JSR-310).
JDK在8之前的版本,對日期時間的處理相當(dāng)麻煩,有些方法設(shè)計非常反人類。而Joda-Time使用起來不僅方便,而且可讀性強(qiáng)。雖然JDK 8引用了新的時間處理類,而且參與設(shè)計的人也正是Joda-Time的作者,但是由于各種原因,很多項目還是使用的JDK7,使用Joda-Time還是一個不錯的選擇。
Joda-Time體驗
對比之前JDK的處理方式,使用了Joda-Time之后,代碼整個神清氣爽了很多。接下來就用一些簡單的例子來對比一下JDk和Joda-Time的的使用。
依賴
只需要引用一個包。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>創(chuàng)建日期
JDK的日期是Date:
Date date = new Date();
Joda-Time的日期是DateTime:
DateTime dateTime = new DateTime();
DateTime在創(chuàng)建的時候還可以輕松的指定特定的日期和時間:
DateTime dateTime = new DateTime(2016, 10, 01, 00, 00);
日期格式化
JDK使用的是SimpleDateFormat來進(jìn)行日期的格式化:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);乍看之下用起來也不麻煩,但是SimpleDateFormat是非線程安全的。
也就是說,如果在并發(fā)環(huán)境下,必須對SimpleDateFormat對象做同步處理,比如用synchronized,比如用ThreadLocal;
或者每次都new一個新的SimpleDateFormat對象,缺點(diǎn)顯而易見,就是浪費(fèi)資源。
而Joda-Time中的DateTime本身就有格式化的方法,對象直接調(diào)用即可:
DateTime dateTime = new DateTime();
String dateTimeStr = dateTime.toString("yyyy-MM-dd HH:mm:ss");當(dāng)然,如果要用轉(zhuǎn)換器,Joda-Time也提供了DateTimeFormatter:
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr = dtf.print(dateTime);而且DateTimeFormatter是不可變的,所以是線程安全的。
SimpleDateFormat和DateTimeFormatter也都可以將字符串轉(zhuǎn)換成日期:
String dateStr = "2016-09-22";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = dtf.parseDateTime(dateStr);日期計算
個人在Joda-Time使用中,最喜歡的是它的日期計算。
比如要得到40天前的日期,在JDK中,計算日期相當(dāng)復(fù)雜,必須借助日歷Calendar來完成:
Date today = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(today); // 設(shè)置日歷 calendar.add(Calendar.DAY_OF_MONTH, -40); // 將日歷往回翻40天 Date beforeDay = calendar.getTime(); // 日歷返回日期
Joda-Time中,日期自帶日期計算功能,非常直觀:
DateTime today = new DateTime(); DateTime beforeDay = today.minusDays(40);
如果要計算兩個日期相差的天數(shù),使用JDK是這樣實(shí)現(xiàn)的:
int diffDays = (int) ((today.getTime() - beforeDay.getTime()) / (24*60*60*1000));
Joda-Time提供了相關(guān)的方法來處理:
int diffDays = Days.daysBetween(yesterday, today).getDays();
除了天數(shù),月數(shù)、年數(shù)計算起來都非常方便,比如月數(shù):
int diffMonths = Months.monthsBetween(yesterday, today).getMonths();
兼容JDK日期
Joda-Time另一個使用起來非常方便的地方就是與JDK日期類的互相轉(zhuǎn)換。
因為很多現(xiàn)成的接口可能是用JDk的日期作為入?yún)⒒蛘叱鰠ⅲ绻鸍oda-Time不能兼容,那很多方便就不復(fù)存在了。
// Date to DateTime Date date = new Date(); DateTime dateTime = new DateTime(date); // DateTime to Date Date date2 = dateTime.toDate(); // Calendar to DateTime Calendar calender = Calendar.getInstance(); DateTime dateTime2 = new DateTime(calender); // DateTime to Calendar Calendar calendar2 = dateTime.toCalendar(Locale.CHINA);
以上就是Java時間處理第三方包Joda Time使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java時間處理Joda Time的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)注冊登錄與郵箱發(fā)送賬號驗證激活功能
這篇文章主要介紹了Java實(shí)現(xiàn)注冊登錄與郵箱發(fā)送賬號驗證激活功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
在剛開始學(xué)習(xí)Java的時候,就了解了Java基礎(chǔ)中的變量,雖然知道這個以后會經(jīng)常用到,但沒想到了基本語法這里,竟然又冒出來了成員變量和局部變量。變來變?nèi)ヌ菀鬃屓烁銜灹?,今天我們就挑揀出來梳理一下?/div> 2016-07-07
Java序列化JSON丟失精度問題的解決方法(修復(fù)Long類型太長)
這篇文章主要給大家介紹了關(guān)于Java序列化JSON丟失精度問題的解決方法,修復(fù)Long類型太長的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03
scala+redis實(shí)現(xiàn)分布式鎖的示例代碼
這篇文章主要介紹了scala+redis實(shí)現(xiàn)分布式鎖的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Java中的Semaphore計數(shù)信號量詳細(xì)解析
這篇文章主要介紹了Java中的Semaphore計數(shù)信號量詳細(xì)解析,Semaphore?是一個計數(shù)信號量,必須由獲取它的線程釋放,常用于限制可以訪問某些資源的線程數(shù)量,例如通過?Semaphore?限流,需要的朋友可以參考下2023-11-11
springmvc 分頁查詢的簡單實(shí)現(xiàn)示例代碼
我們在開發(fā)項目中很多項目都用到列表分頁功能,本篇介紹了springmvc 分頁查詢的簡單實(shí)現(xiàn)示例代碼,非常具有實(shí)用價值,需要的朋友可以參考下。2017-01-01
淺談Spring AOP中args()和argNames的含義
這篇文章主要介紹了Spring AOP中args()和argNames的含義,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot集成ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫分表
ShardingSphere?是一個開源的分布式數(shù)據(jù)庫中間件,旨在為應(yīng)用提供數(shù)據(jù)庫分片、讀寫分離、分布式事務(wù)等功能,下面我們來看看SpringBoot如何集成ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫分表吧2024-12-12最新評論

