linux修改系统时间需三步到位:先用timedatectl set-timezone asia/shanghai设对时区(确保date -r末尾为+0800),再停ntp服务(sudo timedatectl set-ntp false),最后用timedatectl set-time或date -s设时并执行sudo hwclock --systohc同步硬件钟,否则重启失效。

date 显示的时间不是 +0800,说明时区没设对;hwclock 和系统时间不一致,会导致重启后时间回退。直接改 date -s 只是临时生效,必须同步时区 + 硬件钟 + 网络校时三步到位。
确认当前时区是否为 Asia/Shanghai
别只看 date 输出的小时数,重点看时区偏移:date -R 输出末尾要是 +0800 才算北京标准时间。如果显示 +0000、-0500 或 +0900,说明时区配置失败。
检查软链接是否指向正确:ls -l /etc/localtime 应该指向 /usr/share/zoneinfo/Asia/Shanghai(注意不是 GMT+8 或 Etc/GMT-8 —— 后者反直觉:Etc/GMT-8 实际表示东八区,但很多发行版不兼容,优先用 Asia/Shanghai)。
检查环境变量:echo $TZ 如果输出为空或错误值(如 Asia/Tokyo),需补设,但注意:现代 systemd 系统(CentOS 7+/Ubuntu 16.04+)以 /etc/localtime 为准,TZ 环境变量仅影响单个进程,不推荐主依赖。
用 timedatectl 设置时区(推荐,systemd 系统)
timedatectl 是 systemd 提供的统一时钟管理工具,比手动 ln -sf 更可靠,且自动处理 /etc/timezone 和硬件钟同步逻辑。
- 查看当前状态:
timedatectl status,重点关注Time zone和System clock synchronized - 设置时区:
sudo timedatectl set-timezone Asia/Shanghai - 启用 NTP 自动同步(强烈建议):
sudo timedatectl set-ntp true(这会拉起systemd-timesyncd服务)
执行后立刻生效,无需重启、无需 source,所有新旧 shell 都能读到正确时区。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
手动修正时间并同步硬件钟(无 NTP 或需紧急校正)
如果服务器没开 NTP 或刚重装完,先手动校准再固化到硬件钟,否则重启就退回错误时间。
- 用国内 NTP 源快速校时:
sudo ntpdate -u ntp.aliyun.com(-u表示走 UDP 不依赖特权端口,适合被防火墙限制的环境) - 若
ntpdate报no server suitable for synchronization found,换源试试:ntpdate -u pool.ntp.org或ntpdate -u time1.cloud.tencent.com - 把当前系统时间写入硬件钟:
sudo hwclock --systohc(注意参数顺序:sys → hc,不是反过来) - 验证硬件钟:
sudo hwclock --show,输出应与date接近(误差几秒内)
跳过 hwclock --systohc 是常见失误——哪怕 date 看着对了,重启后 BIOS 时间没更新,系统仍会按错误硬件时间启动。
为什么不用 date -s 硬设时间?
date -s "2026-10-02 13:30:00" 能改系统时间,但问题一堆:
- 不改时区,只改绝对时间戳,如果时区错,
date -s设的其实是错的本地时间 - 不触碰硬件钟,重启即失效
- 干扰 NTP 服务:如果
systemd-timesyncd或ntpd正在运行,它可能立刻把时间“纠正”回去,造成震荡 - 容器或云主机中,宿主机可能强制覆盖 guest 时间,
date -s属于徒劳
真正要改时间,优先走 NTP 校准或 timedatectl set-time(systemd 下支持),而不是裸用 date -s。










