最可靠方式是用timedatectl:运行timedatectl status | grep "time zone"查看当前时区,timedatectl list-timezones | grep -i shanghai确认asia/shanghai可用,再sudo timedatectl set-timezone asia/shanghai设置并立即生效。

确认当前时区和可用时区列表
Linux 系统的时区不是靠改 /etc/timezone(Debian/Ubuntu 有这文件但不通用)或硬写 CST 字符串来设置的,CST 是歧义缩写(美国中部时间 / 中国标准时间都叫 CST),系统根本不认这个缩写。真实有效的时区名是像 Asia/Shanghai 这样的 IANA 时区数据库标识。
先看当前设置:
timedatectl status | grep "Time zone"
再查有没有 Asia/Shanghai:
timedatectl list-timezones | grep -i shanghai
- 如果输出包含
Asia/Shanghai,说明系统时区数据库完整,可直接使用 - 如果没输出,可能是精简版系统(如某些 Docker 镜像、嵌入式发行版),需要先安装
tzdata包(apt install tzdata或yum reinstall tzdata) -
CST、China Standard Time、UTC+8这些都不能作为timedatectl set-timezone的参数,会报错Invalid time zone 'CST'
用 timedatectl 设置 Asia/Shanghai
这是现代 systemd 系统(CentOS 7+/RHEL 7+/Ubuntu 16.04+)的标准做法,会自动同步更新 /etc/localtime 和 /etc/timezone(如果存在)。
sudo timedatectl set-timezone Asia/Shanghai
执行后立刻生效,无需重启服务或系统。验证方式:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
date
应显示类似 Wed 12 Jun 2024 03:22:15 CST(这里的 CST 是输出格式里的缩写,不代表你设的是“CST”字符串)
- 注意:该命令要求 root 权限,普通用户执行会提示
Failed to set time zone: Access denied - 如果系统没有 systemd(比如旧版 CentOS 6 或 Alpine Linux 默认无 systemd),
timedatectl命令不存在,得换方法 - 设置后,
/etc/localtime会变成指向/usr/share/zoneinfo/Asia/Shanghai的软链接,别手动删或覆盖它
无 systemd 系统(如 Alpine、CentOS 6)的手动链接法
这类系统不支持 timedatectl,但只要 zoneinfo 数据存在,就能通过软链接搞定:
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
有些老系统还依赖 /etc/timezone 文件(如 Debian init 系统),可选补上:
echo "Asia/Shanghai" | sudo tee /etc/timezone
- 必须用
-f强制覆盖原有链接,否则可能失败 - 路径
/usr/share/zoneinfo/Asia/Shanghai必须真实存在;若提示 No such file,说明tzdata未安装 - 仅改
/etc/localtime就够让大部分程序(包括date、ls -l时间戳)正确显示本地时间,但某些 Java 应用或容器内进程可能仍读取环境变量TZ,需额外处理
容器或 chroot 环境中时区不生效的常见原因
即使宿主机设对了,Docker 容器、LXC、chroot 环境里时区常还是 UTC,因为它们默认不继承宿主机的 /etc/localtime。
- Docker 启动时加参数:
-v /etc/localtime:/etc/localtime:ro(只读挂载,避免容器修改) - 或者构建镜像时在 Dockerfile 里写:
ENV TZ=Asia/Shanghai && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime - Alpine 镜像要额外安装 tzdata:
apk add --no-cache tzdata,否则/usr/share/zoneinfo是空的 - Java 应用若仍显示 UTC 时间,启动时加 JVM 参数:
-Duser.timezone=Asia/Shanghai
真正容易被忽略的是:很多脚本或日志工具(比如 rsyslog)默认不随系统时区动态刷新,改完时区后得重启对应服务才能让新日志打上正确时间戳。










