都9102年了,你還沒使用java8的Date-Time API?

都9102年了,你還沒使用java8的Date-Time API?

Java 8通過發佈新的Date-Time API (JSR 310)來進一步加強對日期與時間的處理。那麼,之前已經有了標準的 java.util.Date以及後來的java.util.Calendar,為什麼還要搞一個Date-Time的API呢?我們先看看原先的Date是如何獲取以及格式化的

原始Date

Date date = new Date();
System.out.println(date);

這樣輸出的結果:

都9102年了,你還沒使用java8的Date-Time API?

我們來解析:

Wed Oct 23 18:31:33 CST 2019

星期三 十月 23日 當前時間 (標準時間) 年份

可讀性太差了,反正很讓我反感。那麼有人就說了,不是有個SimpleDateFormat可以進行格式化嗎?好,我們再按照SimpleDateFormat進行格式化

 Date date = new Date();
System.out.println(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
System.out.println(sdf.format(date));

輸出結果

都9102年了,你還沒使用java8的Date-Time API?

這樣的結果確實是很人性化,一看就明白~但是,在alibaba開發規範手冊中卻不建議我們直接使用SimpleDateFormat呢?

我們可以從它的源碼看問題,

private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// Convert input date to time field list
calendar.setTime(date);
boolean useDateFormatSymbols = useDateFormatSymbols();
for (int i = 0; i < compiledPattern.length; ) {
int tag = compiledPattern[i] >>> 8;
int count = compiledPattern[i++] & 0xff;
if (count == 255) {
count = compiledPattern[i++] << 16;
count |= compiledPattern[i++];
}
switch (tag) {
case TAG_QUOTE_ASCII_CHAR:
toAppendTo.append((char)count);
break;
case TAG_QUOTE_CHARS:
toAppendTo.append(compiledPattern, i, count);
i += count;
break;
default:
subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);
break;
}
}
return toAppendTo;
}

其中calendar這個是共享變量,多線程場景下時使用相同的SimpleDateFormat對象造成衝突,所以線程不安全。所以建議我們使用Java8的Date-Time的API。

java8的Date-Time API

java8新的Date-Time 的API的對日期時間的創建、格式化、解析、計算、修改使用方式很方便。

LocalDate對日期的api

都9102年了,你還沒使用java8的Date-Time API?

以上輸出結果:

都9102年了,你還沒使用java8的Date-Time API?

LocalTime對時間的api

都9102年了,你還沒使用java8的Date-Time API?

以上輸出結果:

都9102年了,你還沒使用java8的Date-Time API?

LocalDateTime對日期時間的api以及格式化

LocalDateTime就是LocalDate與LocalTime的結合,LocalDate與LocalTime擁有的功能,LocalDateTime也同樣擁有。因此我們重點來看看它的格式化

 LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("當前日期時間:"+localDateTime);
System.out.println("當前日期時間格式話之後:" + localDateTime.format(
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS")
));

以上輸出結果:

都9102年了,你還沒使用java8的Date-Time API?

總結

  • LocalDate、LocalTime、LocalDateTim不可變對象(源碼中都類的定義使用了final修飾,成員變量也是),修改這些對象對象會返回一個副本。
  • Java8對日期時間的操作明顯優於標準的 java.util.Date以及後來的java.util.Calendar。

本人水平有限,難免有錯誤或遺漏之處,望大家指正和諒解,提出寶貴意見,願與之交流。


分享到:


相關文章: