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對象,缺點顯而易見,就是浪費資源。
而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是這樣實現(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)⒒蛘叱鰠?,如果Joda-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 Gui實現(xiàn)肯德基點餐收銀系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java Gui實現(xiàn)肯德基點餐收銀系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01SpringBoot統(tǒng)一功能處理示例詳解(攔截器)
這篇文章主要介紹了SpringBoot統(tǒng)一功能處理(攔截器),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08java.util.Collections類—emptyList()方法的使用
這篇文章主要介紹了java.util.Collections類—emptyList()方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11