在使用CentOS服务器的过程中,时间不准是一个看似小事、实则影响很大的问题。日志时间戳错乱会导致排障时对不上事件顺序,HTTPS证书校验失败会引发接口报错,crontab定时任务也可能在错误的时间点触发。CentOS 7之后的版本默认使用systemd管理时间与时区,timedatectl就是与之配套的核心工具。这篇文章详细介绍如何用timedatectl排查和修复时间时区相关的各类问题。

一、用timedatectl查看当前时间状态
排查问题的第一步永远是确认现状。直接在终端执行不带任何参数的命令,即可看到系统时间的完整概况:
timedatectl
Local time: Tue 2024-06-18 15:32:10 CST
Universal time: Tue 2024-06-18 07:32:10 UTC
RTC time: Tue 2024-06-18 07:32:10
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no输出结果里有几个关键字段需要重点关注。Local time是系统本地时间,Universal time是UTC时间,RTC time是主板硬件时钟(RTC)记录的时间。Time zone显示当前时区,如果这里是UTC而服务器业务在国内,日志时间就会比北京时间晚8小时,这就是最常见的时区错误表现。
NTP enabled表示是否开启了网络时间同步,NTP synchronized表示当前是否已经完成同步。如果前者为yes而后者为no,说明NTP服务开启了但没有同步成功,需要检查网络连通性或者chronyd服务状态。RTC in local TZ为no表示硬件时钟使用UTC时间存储,这是Linux推荐的做法,若为yes则可能在双系统场景下引起时间偏差。
如果想单独查看某个时区的信息,或者列出所有可用时区,可以使用如下命令:
# 列出所有可用时区 timedatectl list-timezones # 过滤出中国的时区 timedatectl list-timezones | grep -i shanghai
二、修改系统时区的正确方法
确认时区不对之后,修改操作非常简单。假设需要把时区设置为上海(东八区),执行:
# 设置时区为Asia/Shanghai timedatectl set-timezone Asia/Shanghai # 验证是否生效 timedatectl
需要注意,set-timezone只修改时区,不会改变UTC时间本身。也就是说,如果系统UTC时间是准确的,改完时区后本地时间会立刻正确显示;但如果UTC时间本身就是错的,改时区只会让错误的时间换个时区显示出来,还需要配合下面的时间同步操作。
有些运维同学习惯直接删除/etc/localtime再软链接到目标时区文件,例如ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime。这种做法在效果上和timedatectl一致,但手动链接容易写错路径,而且绕过了systemd的状态管理。推荐统一使用timedatectl,命令更规范,也便于在自动化脚本中判断执行结果。
还有一种常见错误是时区名拼写不正确,比如写成Asia/shanghai或Asia/ShangHai。时区名称区分大小写,写错了命令会直接报错提示Failed to set time zone。拿不准时可以先用list-timezones确认准确的名称再设置。
三、开启NTP自动同步与手动校正时间
时区正确之后,还要保证时间本身是准的。CentOS 7及以上版本推荐使用chronyd做时间同步,先确认服务状态:
# 安装并启动chrony(CentOS 7/8默认已安装) yum install -y chrony systemctl enable --now chronyd # 通过timedatectl开启NTP同步 timedatectl set-ntp true # 查看同步状态 timedatectl | grep -E "NTP"
开启set-ntp后,systemd会调用chronyd与上游时间服务器对时。可以用chronyc sources -v查看当前使用的时间源,如果全部显示为不可达,说明服务器无法访问NTP服务器,国内环境建议把/etc/chrony.conf中的server替换为阿里云或腾讯云的NTP地址,例如ntp.aliyun.com,然后执行systemctl restart chronyd重启服务。
在某些无法联网的内网环境,或者时间偏差特别大需要立即校正的场景下,可以直接手动设置时间:
# 手动设置日期时间(需要先关闭NTP,否则会拒绝修改) timedatectl set-ntp false timedatectl set-time "2024-06-18 15:30:00" # 只设置日期或只设置时间也可以 timedatectl set-time 15:30:00
这里有一个容易踩坑的地方:如果NTP同步处于开启状态,执行set-time会报错,提示Automatic time synchronization is enabled,必须先执行set-ntp false关掉自动同步,设置完成后再重新打开。此外,如果时钟偏差超过一定范围,手动设置会同时校正系统时钟和硬件时钟,对业务的影响要提前评估。
四、硬件时钟不一致与重启后时间还原的排查
有一种典型故障:用timedatectl把时间改正确了,但服务器一重启时间又错了。这多半是硬件时钟(RTC)的问题。系统重启时会从RTC读取初始时间,如果主板电池没电或者RTC本身不准,系统时间就会每次开机都被带偏。可以先查看两者的差值:
# 查看系统时钟与硬件时钟 date hwclock --show # 将当前系统时间写入硬件时钟 hwclock --systohc # 或者把硬件时间同步给系统 hwclock --hctosys
如果发现每次断电后RTC时间都会归零或大幅偏差,基本可以判定是主板CMOS电池电量耗尽,更换纽扣电池即可解决。虚拟机环境则要检查宿主机的时钟配置,部分云平台可以在管理控制台直接开启时钟同步。
另外提醒一点,关于RTC存储的是本地时间还是UTC时间,Linux推荐使用UTC。如果需要调整,可以执行timedatectl set-local-rtc 0切换为UTC存储。在只有Linux的单系统环境下,保持默认的UTC存储可以避免夏令时等带来的时间跳变问题;只有在Windows和Linux双系统共存的机器上,才有必要考虑将RTC设置为本地时间。
总结一下排查思路:先看timedatectl输出的时区和同步状态,时区不对就set-timezone;时间不准就开chronyd做NTP同步;改完重启就失效就检查硬件时钟和CMOS电池。按这个顺序走下来,绝大多数CentOS时间时类问题都能定位并解决。
CentOS时区设置timedatectlLinux时间同步修改时间:2026-09-14 07:33:36