项目改用docker部署后,出现了时区混乱的问题,发现new Date()的时间和mysql自动生成的时间不一样,慢了8个小时,但是前端显示确是正常的。反而由mysql(mysql没有用docker容器)自动生成的时间在数据库显示正常,但是前端却显示错慢了8小时。
解决历程:
用docker exec -it docker_name /bin/bash 进入docker容器,使用date命令查看时间,发现时间比系统慢了8小时。
然后网上找了同步docker容器时间的方法进行时区设置。
第一种:复制系统时间到docker容器,再重启服务
docker cp /etc/localtime docker_name:/etc/localtime 或者
docker cp ../usr/share/zoneinfo/Asia/Shanghai docker_name:/etc/localtime
再重启容器 docker restart
第二种:启动加参数
run 后面加 -v /etc/localtime:/etc/localtime 挂载宿主时间配置
经过修改时间后再次查看docker时间,已经正常,但是发现项目的时间问题依旧没有解决,日志打印的时间还是慢了8小时。
那么说明java调用new date()的时区还是不对,那么如何设置tomcat的时区呢,那就只有在启动jar包的时候加这个命令了
-Duser.timezone=GMT+8
设置为东八区
到此,问题解决了。但是没想到又出现问题了,查询参数用date类型,后台打印参数却变了时间。原来json解析少了指定时区
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endTime;
改为:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date endTime;