本地和线上环境时间不一致问题
事情是这样的,有一个业务需要获取当前时间戳,在本地测试的好好的,可是一到线上Linux服务器部署后,
就出现了本地与线上时间不一致的问题
复现一下场景,就不写Service了,直接复现这个场景问题
java
public class TestController {
@GetMapping("/test")
public Result test(){
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new Result(200,"时间戳为:",simpleDateFormat.format(date).substring(0,19));
}
}
- 然后进行本地测试,ok没有问题就是这个时间

- 再到公网进行测试

-
发现Linux线上的时间和本地(Macos、Windows)的时间竟然不一致,仔细一看刚好就是差8个钟,总觉得跟某个时区的时间差很像
查阅资料后发现是Linux读取时间的时候所属的时区跟本地是不一样的,应该是jvm运行的时区设置问题
在网上看到的解决方法,调整Linux系统时区设置,发现不好使
inivi /etc/sysconfig/clock #编辑时间配置文件 ZONE="Asia/Shanghai" UTC=false #设置为false,硬件时钟不于utc时间一致 ARC=false ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #linux的时区设置为上海时区 ntpdate cn.pool.ntp.org #对准时间 /sbin/hwclock --systohc #设置硬件时间和系统时间一致并校准
最后是通过在Java程序启动的时候添加-Duser.timezone=GMT+8参数,解决了时间不一致问题
以Docker启动Java项目举例,在Dockerfile中添加配置
ini# 设置环境变量 ENV TZ=Asia/Shanghai ENV JAVA_OPTS="-Duser.timezone=GMT+8"