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

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/ParisAsia/TokyoAustralia/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 守护进程(如 chronyntpd),请改用它们各自的 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 directory
timedatectl 通过 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 found
systemd-timesyncd 未安装或未运行。如果你的系统改用 chronyntpd,请用 chronyc trackingntpq -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.confNTP=FallbackNTP= 两行列出了已配置的时间服务器。

如何在系统日志中查看历史时间变更?
timedatectl 本身不保留历史记录,但系统日志会。使用以下命令搜索与时间相关的事件:

journalctl -u systemd-timesyncd

有关阅读系统日志的更多内容,请参阅 journalctl 指南。

结论

对于日常系统管理,timedatectl 通常足以检查当前时间设置、切换时区、切换 NTP 以及检查 RTC 行为。如果你需要特定发行版的时区设置步骤,请参阅关于如何在 Linux 中设置或更改时区的指南。