前言:
最近把项目部署到Linux服务器上遇到了日志输出时间不准的问题,通过参考资料一顿操作下来终于解决了。在查找资料的过程中,发现许多文章不全面,于是决定自己写一篇;此文章是在融合多家之长的基础上加上自己的总结,希望能帮助大家快速解决问题。
问题:
通常情况下,我们会遇到linux系统时区与其上部署的tomcat时区不一致的问题。最常见的是系统时间为正常的CST中国标准时区(东八区),而tomcat日志时间却比系统时间慢了8个小时
概念介绍
在解决问题之前,我们首先要弄清几个概念,在Linux上有几个时间概念:
一、“系统时间”与“硬件时间”
系统时间:一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
二、查看系统时间和硬件时间
1. 系统时间 date
直接调用 date,得到的是本地时间。如果想得到UTC时间的话,使用 date -u。
2. 硬件时间hwclock
直接调用 hwclock。
三、系统时间和硬件时间的同步
同步系统时间和硬件时间,可以使用hwclock命令。
//以系统时间为基准,修改硬件时间
hwclock –systohc <== sys(系统时间)to(写到)hc(Hard Clock)
//以硬件时间为基准,修改系统时间
hwclock –hctosys
解决问题
步骤一:准备工作
在将解决问题之前,首先要确定系统当前时间是正确的。这里可以通过linux的date命令查看当前时间及时区。
1. 如果结果与本地时间或自己想要的效果一致
这种情况可以确定问题是出在tomcat上。可以通过步骤二中所列方法进行解决。
2. 如果结果与本地时间或自己想要的效果不一致
这种情况需要先将系统校正为正确的时区,再通过步骤二的方法解决。具体操作如下:
(1)修改时区,以我们使用的北京时间(东八区)为例
输入:tzselect
tzselect
1、选择洲
2、选择国家
3、选择时间并确认
4.将时区信息添加为环境变量TZ
操作步骤:
# 编辑配置文件
vi /etc/profile
# 添加如下信息
export TZ="Asia/Shanghai"
# 使配置生效
source /etc/profile
(2)修改完时区后,再次使用date命令查看系统时间是否正确
解决了系统时区不正确问题后,如果系统时间和tomcat日志时间仍然不一致,则是tomcat启动时读取时区配置造成的定位到是JVM问题。
步骤二:系统时区与Tomcat时区(JVM)不一致的解决方法
方法一(不推荐):就是在启动jar包的命令中添加时区参数java -jar -Duser.timezone=GMT+08 xxx.jar
但是这是一个临时解决方案, 每次启动都需要添加时区参数, 会很麻烦,。
方法二(推荐):修改/etc/sysconfig/clock配置信息
linux中,JRE每次都从/etc/sysconfig/clock配置文件中获取时区信息,所以可以编辑/etc/sysconfig/clock配置文件添加时区信息,如果没有则新建
ZONE="Asia/Shanghai" #时区 UTC=false #设置为false,硬件时钟不与UTC时间一致 ARC=false #仅用于alpha表明使用ARC。
然后正常重启项目就可以啦
参考文章:
Linux系统与Tomcat时区不一致的解决方法总结(全)-CSDN博客
Linux 系统时间和硬件时间_硬件时间和系统时间-CSDN博客
Linux系统下时间不准的问题_cannot access the hardware clock via any known met-CSDN博客