对于许多与系统相关的任务和进程,使用正确的时区至关重要。 例如,cron守护程序使用系统的时区执行cron作业,日志文件中的时间戳基于系统的时区。

在Linux上,系统的时区是在安装过程中设置的,但在安装之后你也可以轻松的更改系统时区。timedatectl是用于查询和改变系统时钟以及时区,开启或者禁用时间同步服务。

系统时区

timedatectl是一个命令行程序,可让您查看和更改系统的时间和日期。它在所有基于现代systemd的Linux系统上都可用。

如果你Linux系统timedatectl不可用,可跳过timedatectl修改系统时区的方式,参考本教程最后的软链接修改系统时区。

在调用timedatectl命令不使用任何参数时,timedatectl将打印系统的时区。如果安装系统时没有设置时区。系统将使用默认UTC时区。

以下timedatectl命令将会打印系统的时区和所在时区的当前时间。并显示系统时钟服务同步以及NTP服务的状态:

timedatectl
               Local time: Wed 2020-05-06 19:33:20 UTC
           Universal time: Wed 2020-05-06 19:33:20 UTC
                 RTC time: Wed 2020-05-06 19:33:22    
                Time zone: UTC (UTC, +0000)           
System clock synchronized: yes                         
              NTP service: active                      
          RTC in local TZ: no   

上面的timedatectl命令输出,可以注意到系统使用的UTC时区。如果这与你所在的时区不一致。可以继续使用timedatectl修改系统时区。

更改时区

更改时区之前,您需要找出与你当前时区匹配的时区的长名称。长时区的名称使用地区/城市格式作为命名。

如你不知道你所处位置的时区长名称,可以通过使用timedatectl命令的list-timezones选项列出全世界所有可用的时区。

通常timedatectl命令会打印所有时区。我们将timedatectl列出的时区名称通过管道传递给grep命令过滤时区名称。

在本教程中,我们将使用亚洲/上海的时区作为系统的时区。我将大概知道长时区的名称中将包含shanghai的字符。此时我么使用shanghai作为grep的关键词过滤即可找到上海的时区。

以下timedatectl命令打印所有时区,然后通过管道传递grep命令不区分大小写搜索包含括shang关键词的时区:

timedatectl list-timezones | grep -i shang

该命令将打印以下输出:

Asia/Shanghai

现在,已经找到所在位置的时区长名称。

我们就可以使用timedatectlset-timezone选项设置系统的时区,并在set-timezone选项之后传递长时区名称。

请以root或具有sudo权限的用户运行以下timedatectl命令设置系统的时区为Asia/Shanghai

sudo timedatectl set-timezone Asia/Shanghai

上面的timedatectl命令将不会产生任何输出。至此,我们已将系统时区设置为Asia/Shanghai。如你需要验证系统时区是否设置成功。

再次不带任何选项参数调用timedatectl命令,打印系统当前设置的时区即可:

timedatectl
               Local time: Wed 2020-05-06 15:41:42 EDT  
           Universal time: Wed 2020-05-06 19:41:42 UTC  
                 RTC time: Wed 2020-05-06 19:41:48      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                         
              NTP service: active                      
          RTC in local TZ: no   

软链接修改系统时区

Linux系统使用/etc/localtime文件存储着系统的时区,它是一个软链接/符号链接文件。它指向/usr/share/zoneinfo/目录以及子目录下的时区文件。

这些时区文件以二进制的存储着时区的信息。当应用程序需要用户展示时区时。应用程序将读取/etc/localtime最终指向的二进制时区文件。

因此,我们还可以通过修改/etc/localtime符号链接最终指向的二进制时区文件来配置系统的时区。也可以使用ls命令查看当前时区。

以ls命令将打印/etc/localtime所有信息,你会看到/etc/localtime文件的类型是符号链接,并指向/usr/share/zoneinfo/Hongkong

ls -al /etc/localtime
lrwxrwxrwx 1 root root 28 5月  12 19:03 /etc/localtime -> /usr/share/zoneinfo/Hongkong

现在已经确定了系统所有使用的时区。假如我们将时区更改为上海。可使用ln命令直接改变/etc/localtime指向的二进制时区文件修改系统时区。

如你不确定时区名称所在位置,可使用find . -iname "你时区关键字*"命令搜索时区名称的关键字,i表示不区分大小写。

find命令将列出所有可能包含时区名称的关键字的二进制时区。这些文件都可用于使用ln命令设置系统的时区。

以下ln命令修改/创建文件/usr/share/zoneinfo/Asia/Shanghai/etc/localtime的软链接:

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

如果如果你需要验证系统时区是否成功修改或者设置。可使用date命令打印当前系统的时间。当时区发生变化,date命令时间也将会更改。

以下date命令将会打印系统的当前时间:

date

结论

我们向您展示了如何更改Ubuntu系统的时区。如有任何疑问,请随时发表评论。