一、问题背景
服务部署上环境后,服务日志、服务即时信息相关时间都比背景时间慢了8个小时,显然是使用的UTC时间,不符合时间使用要求。
二、问题排查
查看服务器时区、时间
# timedatectl
可以看出,服务器的时间显示准确,UTC、CST 都没问题,关键在于 Time zone 为 n/a
jvm默认会使用系统的时区,系统没有设置具体时区,就使用UTC
java vm取的默认timezone的算法:
1)如有环境变量 TZ设置,则用TZ中设置的时区
2)在 /etc/sysconfig/clock文件中找 "ZONE"的值
3)如何2)都没,就用/etc/localtime 和 /usr/share/zoneinfo 下的时区文件进行匹配,如找到匹配的,就返回对应的路径和文件名。
三、解决办法
将所有服务器时区设置为 Asia/Shanghai
# timedatectl set-timezone Asia/Shanghai
重启所有应用
四、参考
Java TimeZone 和 Linux TimeZone问题
https://my.oschina.net/huawu/blog/4646
java分析工具 jinfo的使用
https://www.jianshu.com/p/ece32dacce64
如何正确设置JVM TimeZone(How to set a JVM TimeZone Properly)
https://www.it1352.com/956218.html
如何设置 JVM 时区
https://www.sohu.com/a/363106030_355142
https://www.baeldung.com/java-jvm-time-zone
Default timezone is incorrectly set occasionally on Linux
http://bugs.sun.com/view_bug.do?bug_id=6456628
如何设置Linux时间
http://www.hypexr.org/linux_date_time_help.php
解决java default Timezone 问题的方法
http://www.minaret.biz/tips/timezone.html