JDK时区问题-设置TZ环境变量 配置Linux时区

一个管理台后端服务,用Docker隔离了三个容器,oracle,nginx,tomcat;后发现管理台查出来的时间和现实时间相差8个小时,一查是Linux时区问题;


  • 于是改之,三台容器都输入一下代码
copycp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

测试了一下,发现问题Docker容器的时区是正确了,可是问题并未得到解决,数据库时间还是慢了8个小时。


  • 于是又查资料,换另外一种设置时区的方法;
copyvi /etc/sysconfig/clock

在里面输入如下内容

copyZONE="Asia/Shanghai"
UTC=false
ARC=false

保存,重启,测试。。。。。发现还是一样,快疯了


  • 第三种方法,设置TZ环境变量

设置环境变量可以在设置系统级别的/etc/profile ,也可以设置用户级别的home目录的.bashrc。由于用的是docker,防止变量重启失效,只能在.bashrc里设置。在.bashrc加入如下内容:

copyexport TZ='CST-8'

保存:然后执行

copysource .bashrc

使设置立即生效。

重启容器,测试,发现时间正常了。。。。哈哈哈哈


总结

上面问题出在JDK的new Date()方法,所以只要设置JDK所在的那个Docker容器的变量就可以,不用每个都设置。JDK的new Date()方法每次调用都会去取环境变量TZ的时区,TZ是TimeZone的缩写,容器内部操作系统并未指定时区(TimeZone)信息,系统默认使用世界标准时(UTC+0),所以导致new Date()出来的数据存库会比当前时间慢8个小时;

参考 https://greycode.top/posts/problem-jdk-timezone/

posted @ 2022-08-15 11:07  Micky233  阅读(1026)  评论(0编辑  收藏  举报