今天,又被Java8的時(shí)間庫(kù)惡心到了,有同感的舉手...
在我所在公司和項(xiàng)目中,實(shí)際上時(shí)間庫(kù)應(yīng)用不算太多,用到也是非常簡(jiǎn)單的一些應(yīng)用場(chǎng)景,一般情況下連Java8的時(shí)間庫(kù)都很少用到,今天為了寫(xiě)個(gè)時(shí)間查詢,把我折騰夠嗆,是我沒(méi)有領(lǐng)悟到Java8時(shí)間庫(kù)的精髓嗎?還是我的功力不夠?一起來(lái)看看吧
需求:給定一個(gè)時(shí)間范圍:Date from, Date to,查詢出在這時(shí)間范圍內(nèi)的記錄并按日期(年月日)分組,每條記錄的日期是包含日期和時(shí)間的,需要進(jìn)行Truncate。如果只輸入一個(gè)日期,那么只統(tǒng)計(jì)該天的所有記錄,即0時(shí)0分0秒到23時(shí)59分59秒之間的記錄。
問(wèn)題1:Java8中的LocalDate與Date互轉(zhuǎn)

Date和LocalDate互轉(zhuǎn)代碼
這個(gè)互轉(zhuǎn)的寫(xiě)法應(yīng)該是比較正統(tǒng)的吧,老鐵們應(yīng)該沒(méi)有什么異議。我就想說(shuō)都是一家的,這轉(zhuǎn)換咋就這么麻煩呢?正常不是應(yīng)該這樣嗎:
LocalDate?ld;
Date?date = ld.toDate();或者:
Date?date;
LocalDate?ld = LocalDate(date);
LocalDate?ld = LocalDate.from(date);看看人家Joda-time:
// from Joda to JDK
DateTime dt =?new?DateTime();
Date?jdkDate = dt.toDate();
// from JDK to Joda
dt =?new?DateTime(jdkDate);// from Joda to JDK
DateTime dt =?new?DateTime();
Calendar jdkCal = dt.toCalendar(Locale.CHINESE);
// from JDK to Joda
dt =?new?DateTime(jdkCal);Java不愧為“渣瓦”,哎,不過(guò)興許還真是咱太菜吧,沒(méi)法領(lǐng)悟Java大佬的設(shè)計(jì)精髓
問(wèn)題2:Calendar和Java8就是完全兩張皮
實(shí)現(xiàn)一個(gè)功能:給定一個(gè)Date,只截取年、月、日,并將其分解為兩個(gè)Date,一個(gè)是XXXX年XX月XX日 00:00:00和XXXX年XX月XX日 23:59:59

用Calendar實(shí)現(xiàn)的代碼
林哥直接把項(xiàng)目中的代碼片段截了個(gè)圖,各位看官是不是覺(jué)得非常累贅,可不是嘛,用Java8的時(shí)間庫(kù)也簡(jiǎn)潔不到哪里去,寫(xiě)法如下:

Java8時(shí)間庫(kù)的寫(xiě)法
堂堂Java8的時(shí)間庫(kù),連基本的截?。╰runcate)操作都木有,哎,說(shuō)你什么好呢,“渣瓦”!
我們?cè)倏纯碕oda的“騷”操作:

Joda時(shí)間庫(kù)的寫(xiě)法
簡(jiǎn)潔的不得了哦
問(wèn)題3:Date還不能直接轉(zhuǎn)LocalDate,這還有天理嗎?
private?LocalDate?dateToLocalDate(Date date)?{
????Instant instant = date.toInstant();
????return?LocalDate.from(instant);
}
居然報(bào)異常了
所以,Java8時(shí)間庫(kù)雖然進(jìn)步很大,但在可用性上還真差點(diǎn)意思,Java程序員已經(jīng)比較苦逼啦,能不能體量體量撒,期待后續(xù)版本會(huì)繼續(xù)迭代吧,讓我們拭目以待。

作者:大話JAVA
www.toutiao.com/i6886042266360775181
全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂(lè)于分享的朋友們一起交流學(xué)習(xí)。
