最近同事们接二连三的Springboot中遇到时间相关的问题,在这里总结下。
数据库内的时间就不对,比如currrent_timestamp后时间不是当前时间差8个小时
对于这个问题其实没有什么好纠结的就是mysql的时区不对或者系统时区不对,默认情况下mysql是使用system timezone的,如果systemtimezone就有问题,当然mysql的timezone也会有问题。修改Linux系统时区的方式如下:
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
这里要说一下的是关于对于Docker容器也会有时区问题,解决的方法如下:
docker cp /usr/share/zoneinfo/$主时区/$次时区 container:/etc/localtime
docker restart [container_name]
数据库中查询的出来的时间正确,打印到日志文件后错误,或者日志文件整个时间不对
这个问题的主要原因在于默认SpringBoot采用Jackson来处理json,在市区是可能会采用其他市区进行,因此在配置文件中可以设置:
spring.jackson.time-zone=GMT+8
日志中的日期正确,json序列化后时间发生错误
发生日志文件中错误的原因主要是jvm有自己的时区,因为系统缺少/etc/sysconfig/clock文件,导致时间不对。解决方法有如下两种:
方法1:手工指定jvm的市区
java -Duser.timezone=GMT+08
方法2:创建或者修改/etc/sysconfig/clock
zone:Asia/Shanghai
UTC:false
明明设置了jsonfiled注解,但是时间还是被序列化成了unix的时间戳
这个主要使用了ObjectMapper引起的,直接上代码
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
本文为Lokie.Wang原创文章,转载无需和我联系,但请注明来自lokie博客http://lokie.wang