问题描述
   
- 直接以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
 
