????????JAVA 8 中重新安排了對時間的處理葱轩,但是項(xiàng)目中還是有很多地方用到老的API,今天用了項(xiàng)目中一個工具類藐握,結(jié)果又被時區(qū)坑了一把靴拱。主要原因還是對API不熟悉導(dǎo)致的,現(xiàn)在將問題記錄如下猾普。
????????問題是這樣的袜炕, 我要把一個String 轉(zhuǎn)成Date類型,這個時候就要用到SimpleDateFormat 這個類了初家,為了項(xiàng)目的可維護(hù)性妇蛀,我找了之前工具類里定義的一個SimpleDateFormat類,而且還是ThreadLocal笤成,感覺很科學(xué)评架。但是當(dāng)我查看Parse出來的Date的值時,卻發(fā)現(xiàn)時間被加了8小時炕泳。嗯.....纵诞,又是時區(qū)問題。昨天剛花時間研究了一番JAVA 8時間API的我感覺又被安排了培遵。
? ? ? ? 百思不得其解浙芙,我就搜索了一把SimpleDateFormat 和 時區(qū), 在一個網(wǎng)頁我看到了這樣一段代碼
SimpleDateFormat f1 =new SimpleDateFormat("yyyy-MM-dd");
f1.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));? ??
????????WTF籽腕! (阿彌陀佛)SimpleDateFormat還能設(shè)置時區(qū)嗡呼!后來想想其實(shí)這是很正常的,因?yàn)镈ate本來是一個帶有時區(qū)的時間皇耗,那么從String變成Date的過程肯定有一個指定時區(qū)的過程南窗,如果不指定,肯定有一個默認(rèn)值郎楼。
????????那么這樣一來的話万伤,肯定有一個地方設(shè)置了SimpleDateFormat的時區(qū),由于它又是ThreadLocal呜袁,所以會影響到所有地方敌买。我到那個工具類里搜索了一把,果然在一個不起眼的地方設(shè)置了0時區(qū)(錯誤的編程示范)阶界。
? ? ? ? 到這里雖然知道這個時間為什么被改掉了虹钮,但是還是有奇怪的地方聋庵。SimpleDateFormat轉(zhuǎn)出來的時間雖然變成了0時區(qū),但是為啥輸出的時間就會加8小時呢芙粱。這是因?yàn)?b>Date的toString方法會默認(rèn)將時間轉(zhuǎn)成當(dāng)前時區(qū)(有副作用的方法)珍策。
????????還是應(yīng)該用JAVA 8 的時間啊宅倒!有時區(qū)沒時區(qū)明明白白。