问题描述
- 直接以Jar包在服务器运行的SpringBoot项目获取的时间戳比当前时间慢12小时1, 并且系统时间并没有问题
- 以docker镜像运行的SpringBoot项目获取的时间戳比当前时间慢8小时, 此问题出现在将问题1解决之后的服务器上
问题1
查看数据库时区与数据库连接配置
使用sql查询数据库当前时间
select now();
发现就是当前时间, 没有任何问题
然后查看数据库连接属性 ?useUnicode=true&characterEncoding=UTF-8**&serverTimezone=UTC**有时区设置
查看服务器系统时间
使用
date
命令, 看到时间: 2019年 10月 11日 星期五 10:12:22 CST
使用
date -R
看到时间及时区: Fri, 11 Oct 2019 10:14:22 +0800
查看服务器硬件时间
使用
sudo hwclock --show
查看服务器硬件时间: 2019-10-11 10:16:36.554545+0800
查看项目日志, 发现项目日志时间也是错的, 比当前时间慢了12小时
通过网上查阅资料, 定位到是JVM问题
首先找到的方法就是在启动jar包的命令中添加时区参数
java -jar -Duser.timezone=GMT+08 xxx.jar
但是这是一个临时解决方案, 每次启动都需要添加时区参数, 会很麻烦, 所以我就找了下面这种一劳永逸的方法。
有一点需要注意: 实际执行的时候, 这几个命令是需要使用管理员权限来执行的, 在前面添加 sudo 就可以
1. 编辑时间配置文件
sudo vim /etc/sysconfig/clock
ZONE=“Asia/Shanghai”
UTC=false #设置为false,硬件时钟不于utc时间一致
ARC=false
2. linux的时区设置为上海时区
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3. 对准时间
sudo ntpdate cn.pool.ntp.org
4. 设置硬件时间和系统时间一致并校准
sudo /sbin/hwclock --systohc
然后正常重启项目就可以啦
问题2
因为在本地测试, 发现插入数据库的数据时间戳没有问题, 由于有了问题1的排查, 直接去看了项目日志, 发现时间确实错的, 但是情况又不一样, 因为这个项目与出现问题1的项目是在同一台服务器的, 只不过这个服务是运行在docker镜像中的
其他网上说的同步宿主机时间的方式我都试过, 对于我这种情况并不适用
最后采用网友建议, 在docker启动时添加参数指定一下时区就可以了 -d -e TZ=“Asia/Shanghai” -v /etc/localtime:/etc/localtime:ro
如:
docker run -d -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -e PARAMS="spring.profiles.active=test" --name commonSecurity -p 9000:8080 -v /home/dataexa/insight-microservice/commonSecurity:/usr/local/tomcat/webapps/ROOT -d tomcat
第一步: 使用
docker ps
查看运行的docker镜像
第二步: 关闭或者删除镜像
关闭镜像
docker stop 镜像名称或镜像id
删除镜像
docker rm -f 镜像名称
第三步: 使用名称发布镜像, 在项目war包解压后的WEB-INF下的classes目录下执行项目启动命令
docker run -d -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -e PARAMS="spring.profiles.active=test" --name commonSecurity -p 9000:8080 -v /home/dataexa/insight-microservice/commonSecurity:/usr/local/tomcat/webapps/ROOT -d tomcat
参考文章: https://blog.csdn.net/fullbug/article/details/78619701