错误的系统时间会导致 TLS 校验失败、让 cron 任务在错误的时刻运行,并使日志留下误导性的时间戳。在基于 systemd 的 Linux 系统中,timedatectl 是检查和更改时间设置的标准工具。

timedatectl 是 systemd 的一部分,在大多数基于 systemd 的发行版中均可使用。它可以处理时区、NTP 同步、RTC(实时时钟)设置以及通过命令行进行的手动时间调整。本指南将通过实际示例讲解它的用法。
语法
不带任何参数调用 timedatectl 时会显示当前状态,这与运行 timedatectl status 效果相同。
timedatectl [OPTIONS] COMMAND
查看当前时间和日期
不带参数运行 timedatectl 即可查看完整的时间状态:
timedatectl
Local time: Tue 2026-04-14 12:00:00 CEST
Universal time: Tue 2026-04-14 10:00:00 UTC
RTC time: Tue 2026-04-14 10:00:00
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
输出显示的是你所配置时区下的本地时间、同一时刻的 UTC 时间,以及硬件时钟(RTC)时间。System clock synchronized: yes 表示 NTP 最近已经同步过时钟。NTP service: active 表示 systemd-timesyncd(或其他 NTP 守护进程)正在运行并管理同步。
如果 RTC in local TZ 显示为 yes,说明硬件时钟被设置为本地时间而非 UTC。大多数 Linux 系统将硬件时钟保持在 UTC,这样可避免重启时夏令时带来的麻烦。
设置时区
要设置系统时区,使用 set-timezone 后跟时区标识符:
sudo timedatectl set-timezone America/New_York
运行后,timedatectl 会立即显示新的时区。该更改在重启后依然保留。
如果你不知道确切的时区标识符,可以使用 list-timezones:
timedatectl list-timezones
由于列表很长,可以配合 grep 按区域进行过滤:
timedatectl list-timezones | grep America
America/Adak America/Anchorage America/Anguilla America/Antigua America/Araguaina America/Argentina/Buenos_Aires ... America/New_York ...
时区标识符遵循 Region/City 格式,例如 Europe/Paris、Asia/Tokyo 或 Australia/Sydney。如需分步讲解,请参阅关于如何在 Linux 中设置或更改时区的指南。
启用和禁用 NTP 同步
NTP(网络时间协议)通过定期与互联网时间服务器同步,使系统时钟保持准确。timedatectl 可以启用或禁用 NTP 管理:
sudo timedatectl set-ntp true
sudo timedatectl set-ntp false
启用 NTP 后,运行 timedatectl 确认输出中出现 NTP service: active。
在手动设置时间之前,请先关闭 NTP。如果 NTP 处于活动状态,timedatectl 会拒绝直接更改时钟。
手动设置时间和日期
要手动设置时钟,必须先禁用 NTP 同步:
sudo timedatectl set-ntp false
然后使用 set-time 子命令设置时间和日期。你可以提供完整的时间戳:
sudo timedatectl set-time '2026-04-15 14:30:00'
如果只想设置时间而保留当前日期:
sudo timedatectl set-time '14:30:00'
如果只想设置日期而保留当前时间:
sudo timedatectl set-time '2026-04-15'
设置时间后,你可以重新启用 NTP,让系统在之后自动同步:
sudo timedatectl set-ntp true
设置硬件时钟模式
RTC(实时时钟,即硬件时钟)可以以 UTC 或本地时间存储时间。Linux 系统通常应将 RTC 保持在 UTC,因为这样可以避免夏令时问题,并且在服务器上表现更好。
要确保硬件时钟使用 UTC,运行:
sudo timedatectl set-local-rtc 0
如果你与期望硬件时钟使用本地时间的其他操作系统双启动,可以将 RTC 切换为本地时间:
sudo timedatectl set-local-rtc 1
更改 RTC 模式后,再次运行 timedatectl 并检查 RTC in local TZ 这一行。仅当同一台机器上的另一个操作系统需要时才使用本地 RTC。
检查 NTP 同步状态
要获取有关 NTP 同步的更多详情,可使用 timesync-status。该子命令由 systemd-timesyncd 提供,会显示当前服务器、偏移量和轮询间隔:
timedatectl timesync-status
Server: 185.125.190.56 (ntp.ubuntu.com)
Poll interval: 34min 8s (min: 32s; max 34min 8s)
Leap: normal
Version: 4
Stratum: 2
Reference: 17.253.52.253
Precision: 1us (-19)
Root distance: 19.455ms (max: 5s)
Offset: -2.408ms
Delay: 29.124ms
Jitter: 5.716ms
Packet count: 5
Offset 表示你的系统时钟在上次同步前的漂移程度。几百毫秒以内的小偏移属于正常现象。较大的偏移可能指向网络问题或配置错误的时间源。
timesync-status 仅在 systemd-timesyncd 负责处理 NTP 时有效。如果你的系统使用了不同的 NTP 守护进程(如 chrony 或 ntpd),请改用它们各自的 status 命令进行检查。
机器可解析的输出
show 子命令以键值对格式打印与 status 相同的信息,更便于在脚本中解析:
timedatectl show
Timezone=Europe/Berlin LocalRTC=no CanNTP=yes NTP=yes NTPSynchronized=yes TimeUSec=Tue 2026-04-14 10:00:00 UTC RTCTimeUSec=Tue 2026-04-14 10:00:00 UTC
传入 --property 可提取单个值:
timedatectl show --property=Timezone --value
Europe/Berlin
在自动化和配置管理脚本中,这非常有用——你无需解析人类可读的 status 输出即可检查当前时区。
要以键值对格式获取 timesync 详情,可使用 show-timesync:
timedatectl show-timesync
这让脚本可以访问 systemd-timesyncd 的属性,例如当前服务器名称、轮询间隔和根距离(root distance)。
timedatectl 选项
以下是常用的选项:
- --no-ask-password:不提示输入认证信息,使用调用用户的凭据
- --adjust-system-clock:在设置 RTC 时,同时相应地调整系统时钟
- --no-pager:直接打印输出,不通过分页器(pager)管道
- -p NAME、--property=NAME:从 show 输出中显示指定的某个属性
- -H ADDR、--host=ADDR:通过 SSH 在远程主机上执行命令
- -M MACHINE、--machine=MACHINE:在本地容器内执行命令
快速参考
以下速查表列出了常用命令及其作用:
| 命令 | 说明 |
|---|---|
timedatectl | 显示当前时间、时区和 NTP 状态 |
timedatectl show | 以键值对格式显示状态(便于脚本解析) |
timedatectl list-timezones | 列出所有可用的时区标识符 |
sudo timedatectl set-timezone TZ | 设置时区(例如 America/New_York) |
sudo timedatectl set-ntp true | 启用 NTP 同步 |
sudo timedatectl set-ntp false | 禁用 NTP 同步 |
sudo timedatectl set-time 'YYYY-MM-DD HH:MM:SS' | 手动设置时间和日期(NTP 必须关闭) |
sudo timedatectl set-local-rtc 0 | 将硬件时钟存储为 UTC |
timedatectl timesync-status | 显示来自 systemd-timesyncd 的 NTP 同步详情 |
timedatectl show-timesync | 以键值对格式显示 NTP 同步详情 |
timedatectl show --property=Timezone --value | 仅打印当前时区名称 |
故障排查
Failed to set time: Automatic time synchronization is enabled
NTP 处于活动状态并锁定了时钟。先用 sudo timedatectl set-ntp false 禁用 NTP,然后再运行你的 set-time 命令。
Failed to set time: Access denied
你需要管理员权限。在命令前加上 sudo。
Failed to connect to bus: No such file or directorytimedatectl 通过 D-Bus 与 systemd-logind 通信。此错误通常出现在最小化的容器或 chroot 环境中,那里 systemd 没有运行。在这种情况下,直接使用 date 命令设置时间:sudo date -s '2026-04-15 14:30:00'。
timesync-status 返回 Failed to query server: Unit dbus-org.freedesktop.timesync1.service not foundsystemd-timesyncd 未安装或未运行。如果你的系统改用 chrony 或 ntpd,请用 chronyc tracking 或 ntpq -p 检查它们的状态。
常见问题
timedatectl 与 date 命令有什么区别?date 用于读取和格式化时间戳,并且可以通过 sudo date -s 设置系统时钟。timedatectl 是 systemd 工具,还管理时区、RTC 和 NTP 同步。在基于 systemd 的系统上,时间配置使用 timedatectl,而时间戳格式化使用 date。
timedatectl 在非 systemd 发行版上能用吗?
不能。timedatectl 是 systemd 的一部分,需要 systemd-logind 和 D-Bus 处于运行状态。在没有 systemd 的系统(例如使用 OpenRC 的 Alpine Linux)上,请使用 date 命令并直接编辑 /etc/localtime 或 /etc/timezone。
如何查看系统正在使用哪些 NTP 服务器?
运行 timedatectl timesync-status 即可查看当前的 NTP 服务器。要查看已配置服务器的完整列表,请检查 /etc/systemd/timesyncd.conf。NTP= 和 FallbackNTP= 两行列出了已配置的时间服务器。
如何在系统日志中查看历史时间变更?timedatectl 本身不保留历史记录,但系统日志会。使用以下命令搜索与时间相关的事件:
journalctl -u systemd-timesyncd
有关阅读系统日志的更多内容,请参阅 journalctl 指南。
结论
对于日常系统管理,timedatectl 通常足以检查当前时间设置、切换时区、切换 NTP 以及检查 RTC 行为。如果你需要特定发行版的时区设置步骤,请参阅关于如何在 Linux 中设置或更改时区的指南。