暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

技术|时区之第1篇系统时区

DigOps 2022-11-29
1771

百度百科:

由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。

正式的时区划分包括24个时区,每一时区由一个英文字母表示。每隔经度15°划分一个时区,有一个例外,每个时区有一条中央子午线;例如,GMT属于“z”区,因此其时间后通常添加后缀“Z”(口语中用后缀“Zulu”)。


时区划分


计算机中也离不开时区的使用,比如中国所在位置是在东八区。可以通过timedatectl
命令查看系统所设置的时区。

[root@postgresql ~]# timedatectl status|grep Time
       Time zone: Asia/Shanghai (CST, +0800)TEXT

本文主要介绍操作系统的时区查看及修改方式。涉及的手段包括:

  • date

  • timedatectl

  • tzselect

  • hwclock

  • /etc/localtime

  • ntpd

  • ntpdate

关于查看

查看的手段可以通过date
, timedatectl
,hwclock
,  /etc/localtime

1、 date

[root@postgresql ~]# date
Mon Nov 28 20:15:10 CST 2022TEXT

这里的CST即指的时区,China Stand Time,中国标准时间,一般用“+8:00”表示。

2、 timedatectl

[root@postgresql ~]# timedatectl status|grep Time
       Time zone: Asia/Shanghai (CST, +0800)TEXT

3、hwclock

[root@postgresql ~]# hwclock --show
Mon 28 Nov 2022 08:19:45 PM CST  -0.525567 secondsTEXT

4、/etc/localtime

[root@postgresql ~]# strings /etc/localtime
...
CST-8TEXT

虽然这几个都能看出时区是哪个,但比较专业的还是timedatectl

关于修改

时区的修改有三种方法,分别为timedatectl
/etc/localtime
tzselect
,下面介绍一下三种方法及区别。

  1. timedatectl
    是最推荐的方式,不但正确,而且修改的也是从根本上修改。

  2. /etc/localtime
    是通过修改软连接的方式改变时区,具有即时性,但不够彻底。

  3. tzselect
    这条命令不具备修改能力,只是提示如何设置修改时区的环境变量,属于引导。

1. timedatectl
即时生效

[root@postgresql ~]# timedatectl  -h
timedatectl [OPTIONS...] COMMAND ...

Query or change system time and date settings.

  -h --help                Show this help message
     --version             Show package version
     --no-pager            Do not pipe output into a pager
     --no-ask-password     Do not prompt for password
  -H --host=[USER@]HOST    Operate on remote host
  -M --machine=CONTAINER   Operate on local container
     --adjust-system-clock Adjust system clock when changing local RTC mode

Commands:
  status                   Show current time settings
  set-time TIME            Set system time
  set-timezone ZONE        Set system time zone
  list-timezones           Show known time zones
  set-local-rtc BOOL       Control whether RTC is in local time
  set-ntp BOOL             Control whether NTP is enabledTEXT

可通过list-timezones
选项查出要设置的时区。

  • timedatectl list-timezones

[root@postgresql ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
...TEXT

以设置America/Panama
为例。

[root@postgresql ~]# timedatectl set-timezone America/Panama
[root@postgresql ~]# timedatectl
      Local time: Mon 2022-11-28 09:30:10 EST
  Universal time: Mon 2022-11-28 14:30:10 UTC
        RTC time: Mon 2022-11-28 14:30:10
       Time zone: America/Panama (EST, -0500)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/aTEXT

这时候通过上述介绍的4种查看方法,均是一致的。

2. /etc/localtime

/etc/localtime
是/usr/share/zoneinfo/目录下的时区文件的软连接。实际上通过timedatectl
设置的时区,也是去建立这个软连接,那么手工去建立这个软连接也是可以做到一样的效果的。

(可以通过删除软连接的方法,再通过timedatectl
去查看时区是否恢复了UTC时区来验证二者的关系!!!)

[root@postgresql ~]# date
Mon Nov 28 09:35:00 EST 2022
[root@postgresql ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
[root@postgresql ~]# date
Mon Nov 28 22:37:42 CST 2022TEXT

再通过timedatectl
验证

[root@postgresql ~]# timedatectl
      Local time: Mon 2022-11-28 22:38:36 CST
  Universal time: Mon 2022-11-28 14:38:36 UTC
        RTC time: Mon 2022-11-28 14:38:36
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/aTEXT

3. tzselect

tzselect
的功能,等同于timedatectl list-timezones

[root@postgresql ~]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 2
Please select a country.
 1) Anguilla              19) Dominican Republic    37) Peru
 2) Antigua & Barbuda     20) Ecuador               38) Puerto Rico
 3) Argentina             21) El Salvador           39) St Barthelemy
 4) Aruba                 22) French Guiana         40) St Kitts & Nevis
 5) Bahamas               23) Greenland             41) St Lucia
 6) Barbados              24) Grenada               42) St Maarten (Dutch)
 7) Belize                25) Guadeloupe            43) St Martin (French)
 8) Bolivia               26) Guatemala             44) St Pierre & Miquelon
 9) Brazil                27) Guyana                45) St Vincent
10) Canada                28) Haiti                 46) Suriname
11) Caribbean NL          29) Honduras              47) Trinidad & Tobago
12) Cayman Islands        30) Jamaica               48) Turks & Caicos Is
13) Chile                 31) Martinique            49) United States
14) Colombia              32) Mexico                50) Uruguay
15) Costa Rica            33) Montserrat            51) Venezuela
16) Cuba                  34) Nicaragua             52) Virgin Islands (UK)
17) Curaçao               35) Panama                53) Virgin Islands (US)
18) Dominica              36) Paraguay
#? 35

The following information has been given:

        Panama

Therefore TZ='America/Panama' will be used.
Local time is now:      Mon Nov 28 09:40:14 EST 2022.
Universal Time is now:  Mon Nov 28 14:40:14 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='America/Panama'; 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:
America/PanamaTEXT

最后的结果可以看出,只是一个引导,通过设置环境变量来改变本环境的时区。

[root@postgresql ~]# date
Mon Nov 28 22:41:56 CST 2022
[root@postgresql ~]# TZ='America/Panama'; export TZ
[root@postgresql ~]# date
Mon Nov 28 09:42:04 EST 2022




文章转载自DigOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论