摘要:在之前的版本,對日期時(shí)間的處理相當(dāng)麻煩,有些方法設(shè)計(jì)非常反人類。體驗(yàn)對比之前的處理方式,使用了之后,代碼整個(gè)神清氣爽了很多。
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之前的版本,對日期時(shí)間的處理相當(dāng)麻煩,有些方法設(shè)計(jì)非常反人類。而Joda-Time使用起來不僅方便,而且可讀性強(qiáng)。雖然JDK 8引用了新的時(shí)間處理類,而且參與設(shè)計(jì)的人也正是Joda-Time的作者,但是由于各種原因,很多項(xiàng)目還是使用的JDK7,使用Joda-Time還是一個(gè)不錯(cuò)的選擇。
Joda-Time體驗(yàn)對比之前JDK的處理方式,使用了Joda-Time之后,代碼整個(gè)神清氣爽了很多。接下來就用一些簡單的例子來對比一下JDk和Joda-Time的的使用。
依賴只需要引用一個(gè)包。
創(chuàng)建日期joda-time joda-time 2.3
JDK的日期是Date:
Date date = new Date();
Joda-Time的日期是DateTime:
DateTime dateTime = new DateTime();
DateTime在創(chuàng)建的時(shí)候還可以輕松的指定特定的日期和時(shí)間:
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一個(gè)新的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);日期計(jì)算
個(gè)人在Joda-Time使用中,最喜歡的是它的日期計(jì)算。
比如要得到40天前的日期,在JDK中,計(jì)算日期相當(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中,日期自帶日期計(jì)算功能,非常直觀:
DateTime today = new DateTime(); DateTime beforeDay = today.minusDays(40);
如果要計(jì)算兩個(gè)日期相差的天數(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ù)計(jì)算起來都非常方便,比如月數(shù):
int diffMonths = Months.monthsBetween(yesterday, today).getMonths();兼容JDK日期
Joda-Time另一個(gè)使用起來非常方便的地方就是與JDK日期類的互相轉(zhuǎn)換。因?yàn)楹芏喱F(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);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66048.html
摘要:要從頭開始,請繼續(xù)使用構(gòu)建。文件夾應(yīng)包含項(xiàng)目運(yùn)行單元測試的報(bào)告。由于該項(xiàng)目尚未進(jìn)行任何單元測試,因此該報(bào)告無效。使用構(gòu)建項(xiàng)目是啟動(dòng)構(gòu)建的首選方式。現(xiàn)在可用于構(gòu)建項(xiàng)目。概要恭喜您現(xiàn)在已經(jīng)創(chuàng)建了一個(gè)簡單而有效的構(gòu)建文件,用于構(gòu)建項(xiàng)目。 本指南將引導(dǎo)您使用Gradle構(gòu)建一個(gè)簡單的Java項(xiàng)目。 你要構(gòu)建什么 您將創(chuàng)建一個(gè)簡單的應(yīng)用程序,然后使用Gradle構(gòu)建它。 你需要什么 大約15分...
摘要:開源時(shí)間日期庫是很好的替代,另外中也推出了新的庫,設(shè)計(jì)理念與相似。令時(shí)間和日期值變得易于管理操作和理解。格式化一個(gè)日期時(shí)間的具體域包括個(gè)年月日時(shí)分秒毫秒星期,分別用不同字母表示。 此前Java處理時(shí)間日期所使用的 Date 和 Calendar 被詬病不已,Calendar 的主要問題對象可變,而像時(shí)間和日期這樣的類應(yīng)該是不可變的,另外其概念模型也有不明確的地方,月份計(jì)算從0開始等等。...
摘要:最后運(yùn)行,如下圖所示,就說明跑通了總結(jié)之前看別人的博客,有選擇項(xiàng),自己弄死活跑不通。選擇那項(xiàng),啥都不選選擇那項(xiàng)。還要注意打包方式,,, 一.工程目錄 下面是搭建之后的目錄showImg(https://segmentfault.com/img/remote/1460000015755454?w=407&h=467); 先看一下目錄關(guān)系 taotao-parent(父工程管理jar包的版...
摘要:要從頭開始,請繼續(xù)使用構(gòu)建?,F(xiàn)在您已經(jīng)準(zhǔn)備好使用構(gòu)建項(xiàng)目,下一步是安裝。項(xiàng)目使用名為的文件定義。項(xiàng)目所屬的組或組織。默認(rèn)情況下,所有依賴項(xiàng)都作為依賴項(xiàng)確定范圍。概要恭喜您已經(jīng)為構(gòu)建項(xiàng)目創(chuàng)建了一個(gè)簡單而有效的項(xiàng)目定義。 本指南將指導(dǎo)您使用Maven構(gòu)建一個(gè)簡單的Java項(xiàng)目。 你要構(gòu)建什么 您將創(chuàng)建一個(gè)提供一天中時(shí)間的應(yīng)用程序,然后使用Maven構(gòu)建它。 你需要什么 大約15分鐘 最喜...
摘要:由于標(biāo)題長度限制,原題是這樣某系統(tǒng)萬,每十分鐘統(tǒng)計(jì)一下請求次數(shù)最多的個(gè)。請求寫到日志的話,其實(shí)就是超大文件中統(tǒng)計(jì)問題。 由于標(biāo)題長度限制,原題是這樣:某系統(tǒng)QPS100萬,每十分鐘統(tǒng)計(jì)一下請求次數(shù)最多的100個(gè)IP。ip請求寫到日志的話,其實(shí)就是超大文件中統(tǒng)計(jì)top k問題。10分鐘6億條記錄,大約是10G級別,所以對于一般單機(jī)處理來講不能一次性加載到內(nèi)存計(jì)算。所以分治算法是處理這類問...
閱讀 2348·2021-08-26 14:14
閱讀 2705·2019-08-29 13:07
閱讀 2115·2019-08-26 11:44
閱讀 698·2019-08-26 10:11
閱讀 2444·2019-08-23 15:43
閱讀 3102·2019-08-23 14:17
閱讀 417·2019-08-23 12:36
閱讀 2150·2019-08-22 15:20