Date类型字段反序列化后值发生变化问题

Date字段在不同机器上序列化、反序列化,时间值出现半个小时的偏差。

然而使用 date
命令查看系统时间,两台机器上的时间是一致的,时区都是CST(中间标准时间)。

>> date
Sat Jun  9 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程序可能会出问题。

原文 

http://www.caosh.me/solution/date-serialize-bug-timezone/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Date类型字段反序列化后值发生变化问题

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址