你有没有遇到过这种怪事?明明现在是上午10点,你去看服务器日志,上面却写着凌晨2点。或者你的定时任务,总是半夜三更才跑,怎么调都不对。排查半天代码没毛病,最后发现是服务器时间错了。这事儿太搞心态了。别急,今天我就手把手教你服务器时间错乱修复,让你不再被时间问题折磨。
很多时候,时间没坏,是“地方”没对上。这就好比你在纽约看北京时间,肯定对不上。服务器也是这个道理。新买的服务器,默认时区可能是UTC(世界标准时间)。咱们在国内,用的是CST(东八区时间)。这中间差了8个小时,一看日志就觉得乱了。
第一步,先看看服务器现在觉得自己在哪。你敲这行命令:
date -R
看输出结果的最后面。如果显示的是 +0000,那就是UTC时区。如果显示的是 +0800,那就是咱们东八区。如果是+0000,那就得改,不改时间永远差8小时。
修改时区其实很简单,就两步。说白了,就是给服务器换个“地图”。你用下面这个命令,把时区文件链接到上海:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
敲完回车,再运行一次 date 看看。是不是时间立马变正常了?这一步就是告诉服务器,你现在在中国,使用北京时间。
很多云服务商的镜像,默认就是UTC时区。你重装系统后,这步还得再做一遍,别忘。还有,有些程序不看系统时区,只读环境变量。你可以在这个文件里 /etc/profile 加一行:
export TZ='Asia/Shanghai'
加完记得执行 source /etc/profile。这样能保证所有程序都认这个时区,省得以后还要单独调程序。
时区对了,还有个问题,就是时间“走得准不准”。服务器的主板电池没电了,或者因为硬件老化,时间会越走越慢。几天不调,可能就慢了几分钟。这对普通用户没事,但对跑定时任务的服务器,那是致命的。
这时候就需要NTP(网络时间协议)出场了。这玩意儿就像个校准器,每隔一会儿就跟网络上的标准时间对一下表。老系统用NTP,新系统推荐用Chrony。咱们以常用的NTP为例。先装包:
yum install ntp -y
或者
apt install ntp -y
装完之后,别急着启动,先找个靠谱的时间服务器地址。国内推荐用阿里云的或者教育网的。
打开配置文件 /etc/ntp.conf。把里面默认的server地址删掉,或者注释掉。加上这几行:
server ntp.aliyun.com iburst
server cn.pool.ntp.org iburst
这里的 iburst 参数很重要。它能让你刚启动服务时,快速同步时间,不用傻等好几分钟。这就好比你想对表,不用等秒针转一圈,马上就能对上。

配置改好了,就启动服务。敲这两个命令:
systemctl start ntpd
systemctl enable ntpd
第一行是现在启动,第二行是开机自启。这样它就会自动跟网络时间保持一致。你再也不用担心服务器时间越走越偏了。以后哪怕断网重启,它也会在联网后第一时间把时间追回来。
上面改的都是“系统时间”,也就是Linux软件里跑的时间。服务器断电或者重启后,系统会去读主板上的“硬件时间”(BIOS时间)。如果这两个时间不一致,你重启一看,时间又乱了,白忙活一场。
所以,咱们在把系统时间调好后,必须把它写入硬件芯片。敲这个命令:
hwclock --systohc
这行代码的意思是:把系统时间(sys)同步给硬件时钟(hc)。这就好比你把墙上的挂表时间,抄到了手表上。下次你断电了,看手表(硬件时间)也是准的。
写完之后,检查一下。敲:
hwclock --show
看看显示的时间,是不是和 date 命令看到的一样。如果一样,那就稳了。这时候你重启服务器,时间依然会保持准确。
有些虚拟机或者云主机,这块设置特别容易乱。如果你发现每次重启时间都变回几年前的,那肯定就是硬件时间没写对。养成好习惯,每次调完时间,顺手敲一下 hwclock --systohc。多这一步,能省去以后无数麻烦。
服务器系统时间对了,是不是就万事大吉了?不一定。有时候你的程序(比如Java写的服务,或者Docker容器)比较“个性”,它不读系统时间,自己有默认时区。这时候你还得单独调程序。
先看看程序启动时有没有指定时区环境变量。你可以看看启动脚本,或者运行环境里有没有 TZ 这个变量。如果程序是跑在Docker里的,默认可能是UTC。
如果是Java程序,最简单的办法是在启动命令里加参数。比如:
-Duser.timezone=Asia/Shanghai
加到你的 java -jar 命令后面。这能强制JVM使用东八区时间。这招特别管用,尤其是接第三方接口报“时间戳错误”的时候,加这行基本能解决。
容器里时间乱,是因为它没挂载主机的时区文件。你启动容器的时候,加这个参数:
-v /etc/localtime:/etc/localtime:ro
这样容器里的时间就和宿主机(你的服务器)完全同步了。不用进容器里瞎折腾,直接用映射的方式最简单。
服务器时间乱,其实不难修。核心就三步:对时区、同步网络时间、写硬件时间。最后再检查下程序配置。别光看不练,赶紧上服务器敲几行命令试试。把时间修好了,以后查日志、跑任务都省心。这就叫磨刀不误砍柴工,现在花5分钟修好,以后能省5小时的排查时间。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图