
服务器时间不准是个隐蔽但要命的问题日志对不上、证书校验失败、数据库主从复制出错、cron 任务差 8 小时。date看时间、timedatectl管时区和 NTP、chrony做网络对时这三件事合起来就是 Linux 时间管理的全貌。这一篇从手动设时间到自动对时一次讲完。一、date看时间和格式化语法格式date[选项][格式]常用格式符符号含义%Y四位年%m月 01-12%d日 01-31%H小时 00-23%M分 00-59%S秒 00-60%sUnix 时间戳从 1970-01-01 起的秒数%F等于%Y-%m-%d%T等于%H:%M:%S示例与预期输出不带参数直接看当前时间date预期输出Wed Sep 16 10:30:45 CST 2026格式化成自己要的样子date%Y-%m-%d %H:%M:%S预期输出2026-09-16 10:30:45算时间差或看相对时间date-d3 days ago预期输出Sun Sep 13 10:30:45 CST 2026-d后跟自然语言写脚本里算日志保留天数、定时清理很顺手。手动设时间没跑 NTP 的场景才需要sudodate-s2026-09-16 10:31:00现代服务器都跑 NTP手动设完过一会儿就被 chrony 拉回标准时间。二、timedatectl时区与 NTP 开关timedatectl是 systemd 提供的时间管理工具一条命令看完时间、时区、NTP 状态。语法格式timedatectl[命令]常用子命令命令作用timedatectl看完整状态timedatectl list-timezones列出所有时区sudo timedatectl set-timezone 时区设时区sudo timedatectl set-time 时间手动设时间sudo timedatectl set-ntp true开关 NTP 自动对时示例与预期输出看状态timedatectl预期输出Local time: Wed 2026-09-16 10:30:45 CST Universal time: Wed 2026-09-16 02:30:45 UTC RTC time: Wed 2026-09-16 02:30:46 Time zone: Asia/Shanghai (CST, 0800) System clock synchronized: yes NTP service: active RTC in local TZ: no重点看四行当前时区、是否已同步、NTP 服务活没活、硬件时钟走 UTC 还是本地时间。改时区。先找时区名timedatectl list-timezones|grep-ishanghai预期输出Asia/Shanghai设上sudotimedatectl set-timezone Asia/Shanghai它本质是把/etc/localtime软链到/usr/share/zoneinfo/Asia/Shanghai。手动改也行timedatectl省事。NTP 开关sudotimedatectl set-ntptrue开了之后 systemd 会拉起 chrony 或 systemd-timesyncd不用自己再enable。三、系统时钟与硬件时钟机器上其实有两个钟系统时钟Linux 内核维护的软件时间开机时从硬件时钟读一次之后自己走。硬件时钟RTC主板上靠电池供电的时钟关机也在走。看硬件时钟sudohwclock预期输出2026-09-16 10:30:50.12345608:00把系统时间写回硬件sudohwclock--systohc把硬件时间读进系统sudohwclock--hctosys通用建议硬件时钟统一走 UTC由操作系统换算成本地时区。timedatectl输出里RTC in local TZ: no就是这个状态。Windows 双系统机器如果 Windows 把 RTC 当本地时间用两边会互相打架这时候才需要timedatectl set-local-rtc 1纯 Linux 服务器别动这个。四、chronyNTP 对时的现代选择Ubuntu 22.04 之后、Rocky 8/9 默认都带 chrony。它由两个部分组成chronyd后台服务、chronyc交互工具。安装与启动sudoaptinstallchrony# Ubuntu/Debiansudodnfinstallchrony# CentOS/Rockysudosystemctlenable--nowchronyd配置文件发行版配置路径Ubuntu/Debian/etc/chrony/chrony.confCentOS/Rocky/etc/chrony.conf默认内容几行关键的pool ntp.ubuntu.com iburst maxsources 4 pool ntp.aliyun.com iburst maxsources 2 driftfile /var/lib/chrony/chrony.drift makestep 1.0 3pool/serverNTP 服务器地址pool是一组地址server是单点。iburst让启动时快速连发几个请求。driftfile记录本机时钟的快慢漂移下次启动参考。makestep 1.0 3前三次同步时如果偏差超过 1 秒就直接跳不等慢慢追上。国内机器把默认国外 pool 换成国内的更稳server ntp.aliyun.com iburst server cn.ntp.org.cn iburst改完重启sudosystemctl restart chronyd查看同步状态chronyc tracking预期输出节选Reference ID : CB699D03 (203.107.6.88) Stratum : 3 Ref time (UTC) : Wed Sep 16 02:31:10 2026 System time : 0.000023456 seconds fast of NTP time Last offset : -0.000012345 seconds RMS offset : 0.000034567 seconds Leap status : NormalLeap status : Normal是健康状态。System time那行告诉你本机时间相对 NTP 快了还是慢了多少。看正在用哪些上游服务器chronyc sources预期输出MS Name/IP address Stratum Poll Reach LastRx Last sample ^ ntp.aliyun.com 2 6 377 45 123us[-123us] /- 45ms ^* 203.107.6.88 2 6 377 12 23us[ 23us] /- 31ms ^- cn.ntp.org.cn 2 6 377 30 -89us[ -89us] /- 58ms^*前面带星号的那行就是当前实际在用的源。^是备选^-是被淘汰的。Reach全377表示连续八次都连上了。chronyc不只是看还能临时管命令作用chronyc sources -v看源的详细质量指标chronyc makestep立刻按当前测量值跳一次不等慢慢收敛chronyc offline/chronyc online手动标记网络断/通影响选源chronyc waitsync 10阻塞等待最多 10 秒直到同步完成脚本里用刚开机时间差得离谱、又不想等 chrony 慢慢追的时候sudo chronyc makestep一把拉齐比手动date -s准——它是按 NTP 源测量值跳的不是瞎设。五、⚠️ 常见错误时区改了但 cron 还是按旧时间跑改时区要重启依赖时间的服务或者干脆重启机器。systemd 的服务大多读一次时区不主动刷新。chrony 装了但不同步timedatectl里NTP service: inactive。多半是装了 chrony 但 systemd-timesyncd 还占着两个 NTP 客户端抢同一个 socket。sudo systemctl disable --now systemd-timesyncd留一个。容器里时间不准容器共享宿主机内核时间自己跑 chrony 没用。把宿主机时间搞对容器自然对。RTC 在 local TZ 导致跨天跳变纯 Linux 机器确认RTC in local TZ: no双 Windows 才需要打开。服务器在没外网的内网找一台能联网的机器当内网 NTP 服务器其他机器server 那台内网IP iburst指过去别让所有机器直接打公网。六、知识扩展chrony 和 ntpd 到底差在哪老文档里常见ntpd现在新机器基本都换成chronyd。两者都讲 NTP 协议但设计取向不一样。对比项ntpdchronyd首次同步速度慢要慢慢调快几分钟内收敛离线/间歇网络表现差能记录漂移联网后快速修正资源占用较高轻虚拟机友好一般好VM 时钟漂移大它处理得好配置文件/etc/ntp.conf/etc/chrony.conf或/etc/chrony/chrony.conf查询工具ntpq -pchronyc sources选谁Ubuntu 22.04/Debian 12、Rocky 8/CentOS 9 默认都是 chrony没必要倒回去装 ntpd。老 CentOS 7 上默认是 ntpd升级时记得迁移。NTP 协议本身是分层的叫 stratumstratum 1: 直接接原子钟/GPS 的服务器 stratum 2: 从 stratum 1 同步 stratum 3: 从 stratum 2 同步你我服务器多半在这层 ...以此类推chronyc tracking输出里那个Stratum : 3就是这个意思。stratum 数字越小越准家庭和办公网络用公网 pool 拿到 stratum 2/3 的源完全够没必要自己架 GPS 时钟。