Linux修改系统时区,服务器时间不对修复
服务器时间不对,最直接的影响是日志时间错乱、定时任务执行偏差、证书校验失败。
如果你登录 Linux 后发现 date 命令输出的时间比北京时间差了几个小时,多半是系统时区设置成了 UTC 或其他区域。
本文按零基础也能照做的步骤,讲清楚如何查看当前时区、用 timedatectl 修改为 Asia/Shanghai,以及手动方式和硬件时钟同步的兜底做法。
先确认当前时区和时间偏差
动手改之前,先搞清楚现在是什么状态。
执行以下命令查看系统时间和时区:
date
timedatectl
如果输出里 Time zone 显示 UTC 或者 America/New_York 之类,而 Local time 和你的北京时间对不上,就说明时区需要修改。
另一种情况是时区正确但时间本身走偏,比如慢了十几分钟,这属于时间同步问题,不是时区问题,两者要分开处理。
判断依据: 时区错误表现为整小时偏差(如差 8 小时),时间同步错误表现为分钟级漂移。
用 timedatectl 修改时区
目前主流发行版(CentOS 7+、Ubuntu 16.04+、Debian 9+)都自带 systemd,推荐优先用 timedatectl,一条命令搞定。
查看可用时区列表:
timedatectl list-timezones | grep Shanghai
确认存在 Asia/Shanghai 后,执行设置:
sudo timedatectl set-timezone Asia/Shanghai
设置完成后立即验证:
date
timedatectl
正常情况 Time zone 会显示 Asia/Shanghai (CST, +0800),Local time 与北京时间一致。
如果系统提示 Failed to set time zone: Access denied,说明当前用户没有 sudo 权限,需要切换到 root 或联系管理员。
没有 systemd 时的手动修改方法
部分老系统或容器环境没有 timedatectl,可以手动链接时区文件。
先备份原文件:
sudo mv /etc/localtime /etc/localtime.bak
再从时区数据库创建软链接:
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
同时把时区名称写入配置文件,避免部分程序读取异常:
echo "Asia/Shanghai" | sudo tee /etc/timezone
注意:Debian/Ubuntu 系用 /etc/timezone,CentOS 系通常只需要 /etc/localtime 软链接即可。
让硬件时钟和系统时间保持一致
改完时区后,硬件时钟(RTC)可能还是旧时区的时间。
查看硬件时间:
sudo hwclock --show
将系统时间写入硬件时钟:
sudo hwclock --systohc
这一步能避免重启后时间又跳回去。
如果服务器开启了 NTP 自动同步,可以顺带检查:
timedatectl set-ntp true
timedatectl status
看到 NTP synchronized: yes 说明自动校时生效。
容易踩的坑和排查思路
改时区本身不复杂,但有几个地方新手经常卡住:
- 容器内改时区不生效:Docker 容器默认继承宿主机时区,如果容器内改了没用,需要在启动时挂载
-v /etc/localtime:/etc/localtime:ro或设置环境变量TZ=Asia/Shanghai。 - 数据库时间还是不对:MySQL 等数据库有自己的时区配置,改完系统时区后要重启数据库服务,或单独设置
default-time-zone = '+08:00'。 - 应用日志时间没变:Java、PHP 等应用可能读取的是 JVM 或 php.ini 里的时区设置,需要单独调整,比如 PHP 的
date.timezone = Asia/Shanghai。 - 软链接建错:如果
/etc/localtime指向了不存在的文件,date命令会报错或显示异常,用ls -l /etc/localtime检查链接目标是否正确。
验证是否修复成功: 重新登录一个 SSH 会话,执行 date 和 timedatectl,确认时区为 CST +0800,并且重启后依然保持。
常见疑问
为什么改了时区,date 显示的还是老时间?
大概率是当前 shell 缓存了旧环境,退出重新登录即可。
也可能是应用层有自己的时区设置,需要单独处理。
服务器时间差几分钟,改时区能解决吗?
不能。
时区解决的是整小时偏差,分钟级漂移属于时间同步问题,需要用 ntpdate 或 chronyd 校准。
修改时区会影响正在运行的服务吗?
已经启动的进程通常不会立即感知时区变化,建议改完后重启相关服务,尤其是数据库和 Web 服务。
timedatectl 和手动改 /etc/localtime 哪个更好?
有 systemd 的系统优先用 timedatectl,它会同时更新配置文件和软链接,更省事。
老系统或容器环境再用手动方式。
按上面步骤操作后,服务器时间基本能恢复到正确的北京时间。
如果仍然异常,优先检查是不是容器环境或应用层时区没同步,而不是反复改系统时区。