3. 什么是时区?

时区是地球按经度划分的区域,每 15 度划分一个时区,起始于英国格林威治,创建时区的目的是帮助人们了解世界其他地方的当前时间。

如今,时区更多的是一种政治划分而非地理划分,因为有时人们需要与不太遥远地区的人们保持相同的时间。并且出于节能的原因,我们今天有了夏令时,这也是时区的一种变体。

时区通常由您所在国家的政府或一些天文机构定义,并用 3 或 4 个字母表示。有关示例,请参见第 3.2 节

使用 timezoneconverter.com 了解全球任何地方的当前时间。

3.1. 夏令时

出于节能的原因,各国政府创建了夏令时。我们的时钟向前拨快了一个小时,这使我们的白天看起来更长。实际上,真正发生的是时区变化。UTC(协调世界时)原始时间仍然是,并将永远是相同的。

稍后我们将了解如何在 Linux 中自动启用和禁用 DST(夏令时)。

3.2. 时区示例

没有什么比示例更好的了

表 1. 巴西时区。相对于 UTC 的偏移量

名称和偏移量DST 名称和偏移量地点
BREST -2:00BREDT -1:00费尔南多·迪诺罗尼亚
BRST -3:00BRDT -2:00圣保罗、里约热内卢、巴西利亚、米纳斯吉拉斯州、东北地区、南部地区等
BRWST -4:00BRWDT -3:00西部地区
BRAST -5:00BRADT -4:00阿克里

请向我发送像美国时区表这样的贡献。

3.3. Linux 上的时区机制

Linux 系统使用基于 GLIBC 动态时区,基于/etc/localtime文件。此文件是指向(或复制自)区域信息文件的链接,通常位于/usr/share/zoneinfo目录下。

从地理物理学的角度来看,世界上只有 360o/15o=24 个时区。但是为了方便人们,并适应所有的政治变化(例如夏令时),您会在/usr/share/zoneinfo中找到数百个 zoneinfo 文件,每个文件对应于世界上的每个城市、国家等。

有些国家,例如巴西,没有固定的夏令时开始日期。它每年在夏季前几个月定义,您最终可能会遇到必须更改 zoneinfo 文件的情况,该文件由文本文件(例如以下文件)通过 zic 编译。

示例 1. 巴西时区信息文本文件

# Brazil Time Zones
#
# Brazilian Time Zones are:
# BREST: East of Brasilia. Fernando de Noronha.
# BRST:  Brasilia, São Paulo, Rio, Northeast, South etc
# BRWST: West of Brasilia. Mato Grosso, Manaus
# BRAST: Acre.
#
# In daylight saving time, letter 'S' changes to 'D'.
# All the brazilian daylight changes can be found here:
#   http://pcdsh01.on.br/
#   http://pcdsh01.on.br/verao1.html
#
# To install, make:
#
# # zic Brazil.txt
#
# Zone files will be installed in /usr/share/zoneinfo (depends on your
# distribution). Then, make a symbolic link from your zone to /etc/localtime:
#
# # cd /etc; ln -sf /usr/share/zoneinfo/Brazil/Brasilia localtime
#
#
# If you have updates and new standards to this file please send to
# Avi Alkalay (avi @ unix.sh)
# Fred Neves (fneves @ registro.br)
#
# Last update: 12 Oct 2005
#
#
# This file is available at
#
# http://avi.alkalay.net/software/zoneinfo/
#

# Rule  NAME    FROM    TO      TYPE    IN    ON      AT      SAVE    LETTER/S
Rule    Brazil  1931    1932    -       Oct    3      00:00   1:00    D
Rule    Brazil  1932    1933    -       Mar   31      00:00   0       S
Rule    Brazil  1949    only    -       Dec    1      00:00   1:00    D
Rule    Brazil  1950    only    -       Apr   30      00:00   0       S
Rule    Brazil  1950    1952    -       Dec    1      00:00   1:00    D
Rule    Brazil  1951    only    -       Apr   16      00:00   0       S
Rule    Brazil  1952    only    -       Mar   31      00:00   0       S
Rule    Brazil  1953    only    -       Feb   28      00:00   0       S
Rule    Brazil  1963    only    -       Oct   23      00:00   1:00    D
Rule    Brazil  1964    only    -       Mar    1      00:00   0       S
Rule    Brazil  1965    only    -       Jan   31      00:00   1:00    D
Rule    Brazil  1965    only    -       Mar   31      00:00   0       S
Rule    Brazil  1965    only    -       Dec    1      00:00   1:00    D
Rule    Brazil  1966    1968    -       Mar    1      00:00   0       S
Rule    Brazil  1966    1967    -       Nov    1      00:00   1:00    D
Rule    Brazil  1984    only    -       Nov    2      00:00   1:00    D
Rule    Brazil  1985    only    -       Mar   15      00:00   0       S
Rule    Brazil  1985    only    -       Nov    2      00:00   1:00    D
Rule    Brazil  1986    only    -       Mar   15      00:00   0       S
Rule    Brazil  1986    only    -       Oct   25      00:00   1:00    D
Rule    Brazil  1987    only    -       Feb   14      00:00   0       S
Rule    Brazil  1987    only    -       Oct   25      00:00   1:00    D
Rule    Brazil  1988    only    -       Feb    7      00:00   0       S
Rule    Brazil  1988    only    -       Oct   16      00:00   1:00    D
Rule    Brazil  1989    only    -       Jan   29      00:00   0       S
Rule    Brazil  1989    only    -       Oct   15      00:00   1:00    D
Rule    Brazil  1990    only    -       Feb   11      00:00   0       S
Rule    Brazil  1990    only    -       Oct   21      00:00   1:00    D
Rule    Brazil  1991    only    -       Feb   17      00:00   0       S
Rule    Brazil  1991    only    -       Oct   20      00:00   1:00    D
Rule    Brazil  1992    only    -       Feb    9      00:00   0       S
Rule    Brazil  1992    only    -       Oct   25      00:00   1:00    D
Rule    Brazil  1993    only    -       Jan   31      00:00   0       S
Rule    Brazil  1993    only    -       Oct   17      00:00   1:00    D
Rule    Brazil  1994    only    -       Feb   20      00:00   0       S
Rule    Brazil  1994    only    -       Oct   16      00:00   1:00    D
Rule    Brazil  1995    only    -       Feb   19      00:00   0       S
Rule    Brazil  1995    only    -       Oct   15      00:00   1:00    D
Rule    Brazil  1996    only    -       Feb   11      00:00   0       S
Rule    Brazil  1996    only    -       Oct   06      00:00   1:00    D
Rule    Brazil  1997    only    -       Feb   16      00:00   0       S
Rule    Brazil  1997    only    -       Oct   06      00:00   1:00    D
Rule    Brazil  1998    only    -       Mar   01      00:00   0       S
Rule    Brazil  1998    only    -       Oct   11      00:00   1:00    D
Rule    Brazil  1999    only    -       Feb   21      00:00   0       S
Rule    Brazil  1999    only    -       Oct    3      00:00   1:00    D
Rule    Brazil  2000    only    -       Feb   27      00:00   0       S
Rule    Brazil  2000    only    -       Oct    8      00:00   1:00    D
Rule    Brazil  2001    only    -       Feb   18      00:00   0       S
Rule    Brazil  2001    only    -       Oct   14      00:00   1:00    D
Rule    Brazil  2002    only    -       Feb   17      00:00   0       S
Rule    Brazil  2002    only    -       Nov    3      00:00   1:00    D
Rule    Brazil  2003    only    -       Feb   16      00:00   0       S
Rule    Brazil  2003    only    -       Oct   19      00:00   1       D
Rule    Brazil  2004    only    -       Feb   15      00:00   0       S
Rule    Brazil  2004    only    -       Nov    2      00:00   1       D
Rule    Brazil  2005    only    -       Feb   20      00:00   0       S
Rule    Brazil  2005    only    -       Oct   16      00:00   1       D
Rule    Brazil  2006    only    -       Feb   19      00:00   0       S



# Zone  NAME                           GMTOFF  RULES/SAVE    FORMAT  [UNTIL]
Zone    Brazil/DeNoronha               -2:00   Brazil        BRE%sT
Zone    posix/Brazil/DeNoronha         -2:00   Brazil        BRE%sT
Zone    right/Brazil/DeNoronha         -2:00   Brazil        BRE%sT

Zone    America/Sao_Paulo              -3:00   Brazil        BR%sT
Zone    America/Rio_de_Janeiro         -3:00   Brazil        BR%sT
Zone    America/Brasilia               -3:00   Brazil        BR%sT
Zone    posix/America/Sao_Paulo        -3:00   Brazil        BR%sT
Zone    posix/America/Rio_de_Janeiro   -3:00   Brazil        BR%sT
Zone    posix/America/Salvador         -3:00   Brazil        BR%sT
Zone    posix/America/Brasilia         -3:00   Brazil        BR%sT
Zone    posix/Brazil/Central           -3:00   Brazil        BR%sT
Zone    posix/Brazil/Brasilia          -3:00   Brazil        BR%sT
Zone    posix/Brazil/Sao_Paulo         -3:00   Brazil        BR%sT
Zone    posix/Brazil/Salvador          -3:00   Brazil        BR%sT
Zone    posix/Brazil/Rio_de_Janeiro    -3:00   Brazil        BR%sT
Zone    right/America/Sao_Paulo        -3:00   Brazil        BR%sT
Zone    right/America/Rio_de_Janeiro   -3:00   Brazil        BR%sT
Zone    right/America/Salvador         -3:00   Brazil        BR%sT
Zone    right/America/Brasilia         -3:00   Brazil        BR%sT
Zone    right/Brazil/Central           -3:00   Brazil        BR%sT
Zone    right/Brazil/Brasilia          -3:00   Brazil        BR%sT
Zone    right/Brazil/Sao_Paulo         -3:00   Brazil        BR%sT
Zone    right/Brazil/Salvador          -3:00   Brazil        BR%sT
Zone    right/Brazil/Rio_de_Janeiro    -3:00   Brazil        BR%sT
Zone    Brazil/Central                 -3:00   Brazil        BR%sT
Zone    Brazil/Brasilia                -3:00   Brazil        BR%sT
Zone    Brazil/Sao_Paulo               -3:00   Brazil        BR%sT
Zone    Brazil/Rio_de_Janeiro          -3:00   Brazil        BR%sT
Zone    Brazil/Salvador                -3:00   Brazil        BR%sT
Zone    Brazil/East                    -3:00   Brazil        BR%sT
Zone    posix/Brazil/East              -3:00   Brazil        BR%sT
Zone    right/Brazil/East              -3:00   Brazil        BR%sT

Zone    Brazil/West                    -4:00   Brazil        BRW%sT
Zone    Brazil/Manaus                  -4:00   Brazil        BRW%sT
Zone    Brazil/Rondonia                -4:00   Brazil        BRW%sT
Zone    Brazil/Roraima                 -4:00   Brazil        BRW%sT
Zone    Brazil/Mato_Grosso             -4:00   Brazil        BRW%sT
Zone    posix/Brazil/Manaus            -4:00   Brazil        BRW%sT
Zone    posix/Brazil/Mato_Grosso       -4:00   Brazil        BRW%sT
Zone    right/Brazil/Manaus            -4:00   Brazil        BRW%sT
Zone    right/Brazil/Mato_Grosso       -4:00   Brazil        BRW%sT
Zone    posix/America/Manaus           -4:00   Brazil        BRW%sT
Zone    right/America/Manaus           -4:00   Brazil        BRW%sT

Zone    Brazil/Acre                    -5:00   Brazil        BRA%sT

				

Rule 块定义了我们更改时区的日期和时间,而在 Zone 块中,我们引用了将管理它的 Rule。请注意,Zone 名称实际上是/usr/share/zoneinfo目录下的文件名,在这里我们为同一个时区定义了几个不同的名称,只是为了方便人们找到他们的时区。

此文件的注释解释了如何使用 zic zoneinfo 编译器(它也已经安装了它们)安装这些时区。为了使其生效,您只需将 zoneinfo 文件链接(或复制)到/etc/localtime即可。在某些发行版中,有一种更高级别(也是首选)的方式来设置时区,详见第 4.1 节

在使/etc/localtime指向正确的 zoneinfo 文件后,您已经处于该时区规则之下,并且 DST 更改是自动的——您不必手动更改时间。

以下命令序列显示了 Linux 时区机制的动态性。请注意,它们都是在一分钟内发出的

bash$ ls -al /etc/localtime
lrwxrwxrwx  1 root root 35 May 22  2001 /etc/localtime -> /usr/share/zoneinfo/Brazil/Brasilia
bash$ date
Fri Mar 29 20:13:38 BRST 2002
bash# ln -sf /usr/share/zoneinfo/GMT /etc/localtime
bash$ date
Fri Mar 29 23:13:47 GMT 2002
bash# ln -sf /usr/share/zoneinfo/Brazil/Brasilia /etc/localtime
bash$ date
Fri Mar 29 20:14:03 BRST 2002

在 20:13,我处于我的默认巴西时区 (BRST),然后我切换到 GMT,我的系统时间变为 23:13!当您的时区进入 DST 时,您会看到类似的效果,但规则都在您的时区内(/etc/localtime链接不会像此示例一样更改)。

在此机器上运行的应用程序(例如,生成访问日志的 Web 服务器)将感受到这种变化,因此对于开发人员来说,记住完整的时间概念是当前的时间加上当前的时区非常重要,如第 2 节中所述。

最后,我切换回了正确的时区。