背景:
项目部署在亚马逊云端EC2机器上,需要迁移项目到k8s的docker容器。
遇到问题:
数据表设置字段类型为datetime,如:北京时间(UTC+8时区)2019年10月1日,
用hibernate存入数据表显示是(UTC+0时区)2019-09-30 16:00:00
分别对应时间为2019年10月1号,2019年10月2号,2019年10月3号
存入2019年10月1日,正常取出应该是2019年10月1日:
但是发现迁移到k8s的时候,
取10月份数据时,从数据库取出的数据格式是:
上述时间应该是2019年10月2号,但直接取出来忽略掉了时区。导致时间错误。
(时间类型只要是datetime,timestamp涉及到时区的,返回的都不正确)
解决方法:
直接在启动脚本(如果有start.sh的话)里面加上:
echo "Asia/Shanghai" > /etc/timezone
就是设置容器里面的时区为北京时间。
参考自:SpringBoot+k8s+docker项目 遇到的时区错误问题
上面的解决方法,
试过了不行:
一种是修改java进程启动参数,-Duser.timezone=Asia/Shanghai。尝试了以后发现不行;
一种是修改spring boot启动参数,spring.jackson.time-zone=Asia/Shanghai,发现还是不行;
=======================
当然,如果设计数据表一开始就不用datetime和timestamp类型,直接用bigint存时间戳最好啦,不用考虑时区问题。
可以看看:如何正确地处理时间