CentOS 7 下设置时区

泄露秘密 提交于 2020-01-13 14:32:46

之前虚拟机跑 VMware 时发现 MySQL 中的时间有误,意识到没设置好系统时区,便按照经验使用以下命令设置时区:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

一通操作之后,数据库中的时间正常了,但是运行 Kotlin 上的 SpringBoot 后端的时候依然存在时区问题,百思不得其解,遂 Google,结果如下:

 

JVM 获取时区流程:

1) 优先使用环境变量 TZ 的值

2) 在 /etc/sysconfig/clock 中查找 ZONE 的值

3) 对 /etc/localtime 和 /usr/share/zoneinfo 下的时区文件名进行匹配,若匹配成功,则返回对应的路径和文件名

 

不难看出我们的问题出现在第三步上,

经过验证,Java 是通过文件名匹配时区的,而 /etc/localtime 本身是个符号链接,

也就是说我们通过 cp 修改其内容本质上其实是修改了它指向的文件的内容,而它指向的文件名并没有变化。

 

此外,date 命令是通过文件内容匹配时区的,这也是为什么执行以上命令后 date 命令可以匹配到正确的时区。

 

知道了这些,我们很容易想到解决方案:创建时区文件的符号链接到 /etc/localtime,具体操作如下:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

此外,在 CentOS 7 还提供了一个更简单的解决方案:

timedatectl set-timezone Asia/Shanghai

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!