时区、区域设置与系统语言
如何设置时区、启用时间同步、配置 UTF-8 区域设置,以及为什么日志和数据库应保持为 UTC。
更新于 2026年8月23日
全新机器通常以 UTC 运行,并且只安装了最少的语言环境。只要您不查看日志、不运行计划任务,就不会察觉到任何问题。一旦涉及 cron、邮件和报表,时间和编码就会变得非常重要。
时区
timedatectl
timedatectl list-timezones | grep Moscow
timedatectl set-timezone Europe/Moscow
timedatectl 会显示本地时间、UTC 以及同步状态。System clock synchronized: yes 这一行表示时钟已通过网络完成同步。
如果同步处于关闭状态:
timedatectl set-ntp true
systemctl status systemd-timesyncd
在 AlmaLinux 和 CentOS Stream 上,通常由 chronyd 负责时间:
systemctl enable --now chronyd
chronyc tracking
语言环境
语言环境决定消息的语言、编码以及数字和日期的格式。最低要求是 UTF-8,否则俄语文件名和程序输出会变成问号。
Debian 和 Ubuntu:
apt install -y locales
dpkg-reconfigure locales
localectl set-locale LANG=ru_RU.UTF-8
AlmaLinux 和 CentOS Stream:
dnf install -y glibc-langpack-ru
localectl set-locale LANG=ru_RU.UTF-8
检查:
locale
locale -a | grep -i utf
更改只对新会话生效——请通过 SSH 重新登录。
控制台中的键盘布局
/hosting/vds/m/<id> 面板“控制台”标签页中的“屏幕”(VNC)视图会原样传递按键。如果您需要直接在那里输入西里尔字母:
localectl set-keymap ru
服务不需要这个——对它们来说 UTF-8 就足够了。
哪些内容应保留为 UTC
将系统本身和数据库保留为 UTC 是合理的,只向人展示本地时间。
- UTC 格式的日志在不同机器之间可以相互比较,并且不会在时钟调整时发生跳变。
- 使用 UTC 的数据库不会破坏时间间隔的计算。
- Cron 按系统时区计算时间:如果您更改了时区,请重新检查所有计划。
systemctl restart cron
crontab -l
常见错误
| 现象 | 原因 | 解决方法 |
|---|---|---|
setlocale: LC_ALL: cannot change locale | 客户端发送了自己的语言环境,但服务器上并不存在 | 生成该语言环境,或在客户端取消 LANG 转发 |
| 文件名出现乱码 | 语言环境不是 UTF-8 | 设置 LANG=ru_RU.UTF-8 并重新登录 |
| 时间“漂移”了几分钟 | 同步处于关闭状态 | timedatectl set-ntp true |
| 任务在错误的时刻运行 | 您更改了时区,但计划保持不变 | 重新计算 crontab |
请在设置备份任务和日志之前更改时区。在正在运行的机器上,更改时区意味着需要一次性检查所有计划。