timedatectl set-timezone 是唯一推荐的永久改时区方式,其他操作要么不持久、要么只影响局部;确认生效需同时满足:timedatectl status 显示 Asia/Shanghai (CST, +0800)、date +%z 返回 +0800、ls -l /etc/localtime 指向 /usr/share/zoneinfo/Asia/Shanghai。

timedatectl set-timezone 是唯一推荐的永久改时区方式,其他操作要么不持久、要么只影响局部。
怎么确认当前时区是否真的生效
别只跑 date 看输出——它可能被 TZ 环境变量临时覆盖,不代表系统级设置已生效。
真正可靠的验证是:
-
timedatectl status | grep "Time zone"输出必须含Asia/Shanghai (CST, +0800) -
date +%z返回+0800(不是+0000或空) -
ls -l /etc/localtime显示软链接指向/usr/share/zoneinfo/Asia/Shanghai
三者都满足才算真正生效。尤其注意:如果 date +%z 还是 +0000,说明 /etc/localtime 没更新或路径不对。
为什么 export TZ=Asia/Shanghai 不管用
这个命令只改当前 shell 的环境变量,对以下场景完全无效:
-
cron任务——它启动时不加载/etc/profile -
systemd服务(如rsyslog、journald)——它们读/etc/localtime,不查TZ - Python 脚本里调用
datetime.now()——glibc 优先走系统时区,TZ只在未设时区时 fallback
想让 cron 生效?在 crontab 文件开头加一行:TZ=Asia/Shanghai;想让 systemd 服务生效?在 unit 文件里写 Environment=TZ=Asia/Shanghai。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
手动建 /etc/localtime 软链接的适用场景
仅在以下情况才考虑手动操作:
- 容器里没
timedatectl(比如 Alpine Linux),且你有 root 权限挂载/etc/localtime - 系统没 systemd(如 BusyBox 嵌入式环境)
-
timedatectl被禁用或损坏
操作必须严格用:sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
之后务必补上:sudo hwclock --systohc——否则硬件钟仍是旧时间,重启后系统又跳回错误时区。
执行 timedatectl set-timezone 前必须检查的两件事
这两点不满足,命令会静默失败或报错:
-
/usr/share/zoneinfo/Asia/Shanghai必须存在。若不存在,说明tzdata包未安装:
Ubuntu/Debian 执行sudo apt install tzdata;
RHEL/CentOS 执行sudo dnf install glibc-common;
Alpine 执行apk add tzdata - 目标时区名必须精确——
Asia/Shanghai是标准写法,China/Beijing或PRC虽然历史上存在,但已弃用,部分新版tzdata中已移除
最容易被忽略的是:timedatectl set-timezone 不仅改了软链接,还写了 /var/lib/timezone 并通知服务刷新。手动 ln -sf 只做了第一件事,剩下得自己兜底。

















