關於時間轉換 SimpleDateFormat 的使用的問題

澀郎發表於2017-03-06

最近一段時間在做一個專案,專案中使用了大量的額時間格式轉換,為了方便,就提取了一個時間操作的工具類,由於使用過於頻繁,且處於壓力測試,每個不到三秒,甚至毫秒級的去呼叫時間工具類裡的轉換方法時,從後臺伺服器查到,上傳的時間偶發性的異常,就是時間竟然格式不對了,竟然出現了 0001-02-22 12:30:26 的情況,我屮艸芔茻,這是什麼情況,怎麼時間回到了古代,公元1年?

當時,我就懷疑,是不是操作過於頻繁,執行緒不安全導致的?為此,修改了呼叫方式。果然,效果顯著,竟然壓力測試幾天,時間轉換錯誤不再出現了。看來確實是這個情況。當時,錯誤出現時,我用的是把 SimpleDateFormat 提取成全域性變數,是 static 變數,在全域性中直接先 new 好。這樣的處理方式是不行的。

今天,我在檢視阿里巴巴 Java 技術開發手冊時,竟然看到了裡面也有這方面的知識,果然,大公司就是考慮周到,竟然在開發手冊的併發處理中說到了 SimpleDateFormat 的使用。手冊裡是這麼說的:

SimpleDateFormat 是執行緒不安全的類,一般不要定義為 static 變數,如果定義為 static,必須加鎖,或者使用 DateUtils 工具類。

而阿里巴巴推薦使用的方式如下:

正例:注意執行緒安全,使用 DateUtils。亦推薦如下處理:

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { 
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        } 
};複製程式碼

說明:如果是 JDK8 的應用,可以使用 instant 代替 Date,Localdatetime 代替 Calendar, Datetimeformatter 代替 Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。

最後,在小密圈分享這個小知識點,希望能夠對大家有所幫助,以後不會犯跟我一樣的錯誤。

在這裡強烈推薦大家看看阿里巴巴 Java 技術開發手冊,沒多少也就30多頁,真的能夠讓你們收益頗豐。

歡迎大家關注我的技術分享公眾號:非著名程式設計師(smart_android)。技術文章均先首發於我的技術分享的微信公眾號。

關於時間轉換 SimpleDateFormat 的使用的問題

相關文章