什麼?你項目還在用Date表示時間

java技術架構 發佈 2019-12-28T09:12:12+00:00

專注於Java領域優質技術,歡迎關注作者: hansonwong99 來自:CodeSheep 為啥會有這篇文章 最近接手了一個別人的老項目,拿到代碼,導入IDEA的那一瞬間,我哭出了聲 . . .我瞥了一眼代碼,就知道這次肯定遇到了屎山!

專注於Java領域優質技術,歡迎關注

作者: hansonwong99 來自:CodeSheep


為啥會有這篇文章

最近接手了一個別人的老項目,拿到代碼,導入IDEA的那一瞬間,我哭出了聲 . . .

我瞥了一眼代碼,就知道這次肯定遇到了屎山!因為我看到了這種代碼:

我擦,這都什麼年代了,怎麼還在用 Date來處理和表示時間!

完了完了 . . .


為啥Date遭嫌棄了

別的先不說,我們先來看幾個關於 Date用法的例子,這玩意真的好用嗎?

一、我想新建一個表示"此刻"的日期,列印出來:



  • 第一行:這列印結果你第一眼能看明白?可讀性忒差了
  • 第二行:今天是2019年,你給我返回個119,沒法讀
  • 第三行:現在是12月份,你給我返回個11,這也沒法讀

二、假如我再想構造一個指定年、月、日的時間,我嘗試這麼去做:

Date beforeDate = new Date(2019,12,12);

你看到啥了,連構造函數都被棄用了!

你可以再仔細瞅瞅,其實 Date里的很多方法現在都已經棄用了!

都這樣了,你項目還敢用這個嗎?你醒醒吧!


LocalDateTime不香嗎?

自 Java8開始, JDK中其實就增加了一系列表示日期和時間的新類,最典型的就是 LocalDateTime。直言不諱,這玩意的出現就是為了幹掉之前 JDK版本中的 Date老哥!

同樣,我們也先來感受一下用法!

一、獲取當前此刻的時間


幹得漂亮!

二、構造一個指定年、月、日的時間:

比如,想構造:2019年10月12月12日9時21分32秒

LocalDateTime beforeDate = LocalDateTime.of(2019, Month.DECEMBER, 12, 9, 21, 32);

沒毛病!

三、修改日期

夠靈活!

四、格式化日期

我無話可說,漂亮

五、時間反解析

給你一個陌生的字符串,你可以按照你需要的格式把時間給反解出來

LocalDateTime time = LocalDateTime.parse("2002--01--02 11:21",DateTimeFormatter.ofPattern("yyyy--MM--dd HH:mm"));
System.out.println("字符串反解析後的時間為:" + time);
// 輸出:字符串反解析後的時間為:2002-01-02T11:21

tql!

零零散散舉了這麼些例子,我想 LocalDateTime怎麼地也不輸 Date吧!


線程安全性問題!

其實上面講來講去只講了兩者在用法上的差別,這其實倒還好,並不致命,可是接下來要討論的線程安全性問題才是致命的!

其實以前我們慣用的 Date時間類是可變類,這就意味著在多線程環境下對共享 Date變量進行操作時,必須由程式設計師自己來保證線程安全!否則極有可能翻車。

而自 Java8開始推出的 LocalDateTime卻是線程安全的,開發人員不用再考慮並發問題,這點我們從 LocalDateTime的官方源碼中即可看出:

不說別的,就光一句:

This class is immutable and thread-safe.  (不可變、線程安全!)

你就沒有任何理由不用 LocalDateTime!


日期格式化的選擇

大家除了慣用 Date來表示時間之外,還有一個用於和 Date連用的 SimpleDateFormat 時間格式化類大家可能也戒不掉了!

SimpleDateFormat最主要的致命問題也是在於它本身並不線程安全,這在它的源碼注釋里已然告知過了:

那取而代之,我們現在改用什麼呢?其實在前文已經用到啦,那就是了 DateTimeFormatter了,他也是線程安全的:


小聲BB

好了,說了這麼多,如果你項目里還在使用 Date或者 SimpleDateFormat的話,答應我,二話別說,趕快全部偷偷去改掉,快!速度!跑步前進!

關鍵字: