之前虚拟机跑 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
来源:https://www.cnblogs.com/awdriv/p/11313022.html