前言

如果你的 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区。NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量,因此配置一个 NTP 对时间进行同步并不能解决时区不正确的问题。所以大家在用了国外云计算服务商如 Microsoft Azure 或其它 VPS、虚拟机时,需要注意是否与中国大陆的时区一致。

教程

查看Linux当前时区

你可以使用如下命令非常容易地就查看到 Linux 系统的当前时区:

root@mcheng:~# date
Mon 09 May 2022 02:24:05 AM EDT

root@mcheng:~# ls -l /etc/localtime
lrwxrwxrwx 1 root root 30 Aug 16  2021 /etc/localtime -> /usr/share/zoneinfo/US/Eastern

获取时区TZ值

要更改 Linux 系统时区首先得获知你所当地时区的 TZ 值,使用 tzselect 命令即可查看并选择已安装的时区文件。

执行 tzselect 命令

root@DMIT-SIeyeophVm:~# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa                                                             7) Europe
2) Americas                                                           8) Indian Ocean
3) Antarctica                                                         9) Pacific Ocean
4) Asia                                                              10) coord - I want to use geographical coordinates.
5) Atlantic Ocean                                                    11) TZ - I want to specify the time zone using the Posix TZ format.
6) Australia
#? 4        //通过向导选择你所在大洲
Please select a country whose clocks agree with yours.
1) Afghanistan            10) Cyprus                19) Japan                 28) Macau                 37) Qatar                 46) Turkmenistan
2) Armenia                11) East Timor            20) Jordan                29) Malaysia              38) Russia                47) United Arab Emirates
3) Azerbaijan             12) Georgia               21) Kazakhstan            30) Mongolia              39) Saudi Arabia          48) Uzbekistan
4) Bahrain                13) Hong Kong             22) Korea (North)         31) Myanmar (Burma)       40) Singapore             49) Vietnam
5) Bangladesh             14) India                 23) Korea (South)         32) Nepal                 41) Sri Lanka             50) Yemen
6) Bhutan                 15) Indonesia             24) Kuwait                33) Oman                  42) Syria
7) Brunei                 16) Iran                  25) Kyrgyzstan            34) Pakistan              43) Taiwan
8) Cambodia               17) Iraq                  26) Laos                  35) Palestine             44) Tajikistan
9) China                  18) Israel                27) Lebanon               36) Philippines           45) Thailand
#? 9     //通过向导选择你所在国家
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#? 1      //通过向导选择你所在城市

The following information has been given:

        China
        Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Selected time is now:   Mon May  9 14:22:16 CST 2022.
Universal Time is now:  Mon May  9 06:22:16 UTC 2022.
Is the above information OK?
1) Yes
2) No
#? 1     //通过导向确认时间是否正确

You can make this change permanent for yourself by appending the line
        TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai     //确认时区信息

tzselect 最终将以 Posix TZ 格式(例如 Asia/Shanghai)输出你所在的时区值,将此记录下来,然后执行:

TZ='Asia/Shanghai'; export TZ

执行完成之后需要重新登录系统或刷新 ~/.bashrc 生效:

ource ~/.bashrc

检验系统当前时间:

root@DMIT-SIeyeophVm:~# date
Mon 09 May 2022 02:28:56 PM CST

然后在执行:

sudo rm -f /etc/localtime

sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

更改 Linux 系统整个系统范围的时区。

使用Systemd更改Linux系统时区

如果你使用的 Linux 系统使用 Systemd,还可以使用 timedatectl 命令来更改 Linux 系统范围的时区。在 Systemd 下有一个名为 systemd-timedated 的系统服务负责调整系统时钟和时区,我们可以使用 timedatectl 命令对此系统服务进行配置:

[root@lax ~]# sudo timedatectl set-timezone 'Asia/Shanghai'
[root@lax ~]# datetimecal
      Local time: Mon 2022-05-09 15:10:51 CST
  Universal time: Mon 2022-05-09 07:10:51 UTC
        RTC time: Mon 2022-05-09 07:08:53
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
[root@lax ~]# date
Mon May  9 15:11:14 CST 2022