百度百科:
由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。
正式的时区划分包括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
,下面介绍一下三种方法及区别。
timedatectl
是最推荐的方式,不但正确,而且修改的也是从根本上修改。/etc/localtime
是通过修改软连接的方式改变时区,具有即时性,但不够彻底。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