Date型別欄位反序列化後值發生變化問題
Date欄位在不同機器上序列化、反序列化,時間值出現半個小時的偏差。
然而使用date
命令檢視系統時間,兩臺機器上的時間是一致的,時區都是CST(中間標準時間)。
>> date Sat Jun9 13:49:21 CST 2018
而且/etc/sysconfig/clock
檔案內容也是一樣的。
>> cat /etc/sysconfig/clock ZONE="Asia/Shanghai"
解決方案
方法一
通過TimeZone.setDefault
方法在Java程式碼中強制設定時區為東8區。
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); // or TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
方法二
在JVM啟動引數中增加-Duser.timezone=Asia/Shanghai
,或者為GMT+8
。
方法三
後來發現,是因為伺服器上的/etc/localtime
檔案指向的是/usr/share/zoneinfo/Asia/Harbin
,從而導致序列化Date時出現時區偏差。
Java通過/usr/share/zoneinfo/Asia/Harbin
的檔名來確定時區,而系統命令date
是通過檔案內容來確定的,因此結果不同。
解決方法是
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
此方法在CentOS 6.5系統上驗證,這裡不能使用cp
命令將檔案複製過來,否則Java程式可能會出問題。