2025/12/17211

Debian/Ubuntu 设置系统时区,非常简单的交互指令

欢迎回到博壹BOYY的“服务器永夜城” 🤘。今天咱们不折腾什么自签证书或者Docker连炸,就干一件特简单的事儿——给 Debian/Ubuntu 换时区。但别以为简单就不出幺蛾子,我这种常年把VPS买到北极圈附近的人,最怕系统时间漂成“不知道今夕是何年”的灵异状态,然后 PHP 和 MySQL 各自在平行宇宙里报时,那酸爽……


在 Debian/Ubuntu 上,官方给了个“老古董级”但绝对好使的交互式工具:

dpkg-reconfigure tzdata

回车之后你会进入一个蓝底灰框的 TUI 界面(论颜值它绝对能获得「终端设计怀旧奖」),用方向键跟着提示选就行。比如咱们伟大祖国的时区,依次选 AsiaShanghai。完事儿屏幕一刷,你会看到类似这样的输出:

$ dpkg-reconfigure tzdata

Current default time zone: 'Asia/Shanghai'
Local time is now:       Wed Sep 22 15:42:31 CST 2025.
Universal Time is now:   Wed Sep 22 07:42:31 UTC 2025.

恭喜你,系统时区已经切换到东八区了 —— 如果你看到的时间是对的那就是奇迹,因为往往这之后 PHP 还在 UTC 里躺尸 😅。


⚠️ 但是,我知道你在偷偷踩坑

你猜怎么着?dpkg-reconfigure tzdata 实际上改写了 /etc/localtime/etc/timezone,系统自己的 date 命令立马服服帖帖。可你的 PHP-FPMMariaDB/MySQL 这些老爷们儿,很可能还在用 UTC 的时区配置。典型表现就是:WordPress 发布时间差了8小时,而你瞪着 NOW() 函数开始怀疑人生。

所以答应我,除了系统级操作,再去逐个伺候这些“时间刺客”:

🐘 PHP 时区修正

找到你跑的那一版 PHP 的 php.ini(比如 /etc/php/8.2/fpm/php.ini/etc/php/8.2/cli/php.ini),把 date.timezone 那一行改成:

date.timezone = Asia/Shanghai

然后重启 PHP-FPM:systemctl restart php8.2-fpm(版本号按你的实际来)。如果你用宝塔或其他面板,在面板里设也行,别问我为什么知道,因为我曾熬夜写了个脚本自动同步这行配置……

🗃️ MySQL / MariaDB 时区设置

数据库默认时区往往是系统时区,但某些主机商的模板是硬编码的 UTC。执行一下 SQL 瞬间就懂:

SELECT @@global.time_zone, @@session.time_zone;

如果返回的不是 SYSTEM 或者你期望的 +08:00,那么你可以动态设一下:

SET GLOBAL time_zone = '+08:00';

或者直接写入配置文件 /etc/mysql/mariadb.conf.d/50-server.cnf(Debian系常见路径),在 [mysqld] 段添加:

default_time_zone = '+08:00'

然后 systemctl restart mariadb。注意,某些极老版本不支持 +08:00 写法,那就得老老实实填 Asia/Shanghai,前提是你得先把 tzdata 装全,并且用 mysql_tzinfo_to_sql 加载时区表 —— 啊,另外一篇折腾文我们以后再聊。


💡 顺便叨叨现代玩法

如果你用的是 systemd 的系统(现在基本都标配了),其实一条命令更时髦:

timedatectl set-timezone Asia/Shanghai

这就相当于同时帮你改了上述那些文件,还顺带给你日志里打条记录。但我知道,咱们这些硬核玩家有时候就是爱敲 dpkg-reconfigure tzdata 找那种“我在修服务器”的存在感💻。

好了,去把你那些服务的时间线拉回同一个次元吧,别让日志时间线分裂成 MCU 多元宇宙。我是博壹BOYY,下次再见可能是服务器又把 apt 搞挂的时候 👋。


拓展知识点:

  • CST 是模糊的缩写,在中国代表 China Standard Time (UTC+8),但在美国可以指 Central Standard Time。这也是为什么推荐用 +08:00 或 IANA 标准名称 Asia/Shanghai 来避免歧义。
  • /etc/localtime 实际上是一个指向 /usr/share/zoneinfo/ 下对应时区文件的符号链接,dpkg-reconfigure tzdata 会帮你重建它。
  • 如果你在 Docker 容器里踩过时区坑,自己把宿主机的 /etc/localtime 挂载进去是居家必备的骚操作😉。

评论

还没有评论。