Unix 之书
☰ 目录

附录 F...

时区与 24 小时制 (Time Zones and 24-Hour Time)

Unix 和互联网在全世界范围内使用,因此 时间的表述必须谨慎,尤其是在电子邮件 消息和 Usenet 文章的头部信息中。

一般来说,Unix 和互联网都使用 24 小时制 时钟。例如,在一封电子邮件消息的头部信息 中,你可能会看到 20:50,而不是 8:50 PM。 如果你还不习惯 24 小时制,可以使用下面的 换算信息。

24 小时制与 AM/PM 计时制
之间的换算

(午夜) 12:00 AM = 00:00  12:00 PM = 12:00 (中午)
     1:00 AM = 01:00   1:00 PM = 13:00
     2:00 AM = 02:00   2:00 PM = 14:00
     3:00 AM = 03:00   3:00 PM = 15:00
     4:00 AM = 04:00   4:00 PM = 16:00
     5:00 AM = 05:00   5:00 PM = 17:00
     6:00 AM = 06:00   6:00 PM = 18:00
     7:00 AM = 07:00   7:00 PM = 19:00
     8:00 AM = 08:00   8:00 PM = 20:00
     9:00 AM = 09:00   9:00 PM = 21:00
    10:00 AM = 10:00  10:00 PM = 22:00
    11:00 AM = 11:00  11:00 PM = 23:00

无论程序何时需要知道时间、日期或时区, 它们都是从 Unix 维护的设置中获取这些 信息的。例如,当你发送一封邮件消息时, 你的邮件程序会把日期、时间和时区写在 这条消息上。

为确保时间和日期始终正确,大多数 Unix 系统使用一个程序,把计算机的时钟与互联网上 精确的时间源同步。这个程序在后台运行, 按固定的时间间隔自动检查时间和日期, 并在必要时做出修正(*)。虽然时间检查是 自动进行的,你确实需要确保自己的时区 设置正确。通常,这件事是在你安装 Unix 的时候完成的。

* 脚注

时间检查是通过一套称为 NTP(Network Time Protocol,网络时间协议)的系统来 完成的。NTP 的用途是把计算机的时钟与 一个参考时钟同步。这个参考时钟可以在 同一个网络上,也可以在互联网上。

完成这项工作的程序是 ntpd,它是 一个在后台运行的守护进程。有些系统使用 一个称为 ntpdate 的程序,它不是 守护进程。ntpd 在时间同步方面做得 更好,最终它会取代 ntpdate。出于 这个原因,ntpdate 的使用已被弃用。 类似地,一个更老的程序 rdate 也 被弃用,而改用 ntpd

在实践中,你会看到时区信息以三种不同的 方式表示。第一种,当你看到一个具体的时间 时,可能还会看到本地时区的缩写。例如,下面 是 date 命令(见第 8 章)的输出, 显示的时间是 8:50 PM,太平洋夏令时间 (PDT):

$ date
Sun Dec 21 20:50:17 PDT 2008

你看到同样信息的另一种方式,是把时间换算 成 UTC(Coordinated Universal Time, 协调世界时),它也被称为 GMT(Greenwich Mean Time)或 UT(Universal Time)(*)。如果你 不熟悉 UTC,我在下面会做出解释。

* 脚注

UTC、GMT 和 UT 之间存在技术上的差异。 不过,就实际用途而言,你可以把它们看作 是相同的。

UTC 被认为是一种通用的时间。人们期望, 每个使用互联网的人都能把 UTC 时间换算 成自己的本地时间。如果你不确定该怎么做, 图 F-1 和图 F-2 中的表格会对你有所帮助。

你常常会在电子邮件消息或 Usenet 文章中 看到 UTC/GMT/UT 时间,即使这条消息或文章 并不是出自 UTC 时区。这种换算是由软件自动 完成的。举例来说,下面是与上面那个时间相同 的时刻,只是以 UTC 表示。要以这种格式显示 当前时间,请在 date 命令中加上 -u 选项:

$ date -u
Sun Dec 21 03:50:17 UTC 2008

请注意,在这个例子中,UTC 时间是 3:50 AM, 已经是后一天了。这是因为 UTC 比 PDT 早 7 个小时。作为参考,图 F-1 汇总了美国所用 的时区以及它们与 UTC 的差值;图 F-2 对 欧洲和印度的时区做了同样的事情。

你可能看到时间的最后一种表示方式,是本地 时间后面跟着与 UTC 相差的小时数。下面是 取自一封邮件头部信息的一个例子。这种格式与 date 命令的格式略有不同。

Date: Sun, 21 Dec 2008 20:50:17 -0700

这一行头部信息显示的是同一个时间,8:50 PM, 并且表明本地时区与 UTC 相差 -7 小时。

Figure F-1: 美国的时区

美国大部分地区在三月的第二个星期日改用夏令时, 并在十一月的第一个星期日改回标准时间。

缩写 时区 与 UTC 的差值
UTCCoordinated Universal Time0
GMTGreenwich Mean TimeUTC 相同
UTUniversal TimeUTC 相同
ESTEastern Standard Time-5 小时
EDTEastern Daylight Time-4 小时
CSTCentral Standard Time-6 小时
CDTCentral Daylight Time-5 小时
MSTMountain Standard Time-7 小时
MDTMountain Daylight Time-6 小时
PSTPacific Standard Time-8 小时
PDTPacific Daylight Time-7 小时

Figure F-2: 欧洲与印度的时区

在大多数地方,改用夏令时是在四月的 第一个星期日。改回常规时间是在十月的 最后一个星期日。

缩写 时区 与 UTC 的差值
UTCCoordinated Universal Time0
GMTGreenwich Mean TimeUTC 相同
UTUniversal TimeUTC 相同
WETWestern European TimeUTC 相同
WESTWestern European Summer Time+1 小时
BSTBritish Summer Time+1 小时
ISTIrish Summer Time+1 小时
CETCentral European Time+1 小时
CESTCentral European Summer Time+2 小时
EETEastern European Time+2 小时
EESTEastern European Summer Time+3 小时
ISTIndia Standard Time+5.5 小时

一旦你了解了各个时区与 UTC 的差值,就可以 利用图 F-1 和图 F-2 中的表格来换算本地 时间、计算时区之差。下面举几个例子。


你住在纽约,当时是夏天。你收到一封 电子邮件,上面写着时间 17:55 UTC。换算成 你的本地时间是几点?

夏天时,纽约使用 EDT(Eastern Daylight Time)。对照表格可以看到,UTC 与 EDT 相差 -4 小时。因此,17:55 UTC 就是 13:55 EDT, 也就是纽约时间 1:55 PM。


你住在加利福尼亚,有一位朋友在德国。 他那边比你早几个小时?

假设现在是冬天。加利福尼亚使用 PST(Pacific Standard Time),德国使用 CET(Central European Time)。从表格中可以看到,UTC 与 PST 相差 -8 小时,UTC 与 CET 相差 +1 小时。 因此,你的朋友比你早 9 个小时。

夏天时,PST 变为 PDT,CET 变为 CEST。 不过,这两个时区之间的差值并没有改变, 你的朋友仍然比你早 9 个小时。


你在美国西海岸一家技术先进的互联网公司 工作。你是 Foobar 部门的经理,必须安排一个 每周电话会议,与会者包括在印度班加罗尔工作 的程序员,以及在纽约工作的信息混乱副总裁 (Vice President of Information Confusion)。 会议安排在什么时间最合适?

先假设现在是冬天。美国西海岸使用 PST, 纽约使用 EST,印度使用 IST(India Standard Time)。根据表格,PST 与 UTC 相差 -8 小时, EST 与 UTC 相差 -5 小时,IST 与 UTC 相差 +5.5 小时。这就是说,印度比纽约早 10.5 个小时,比美国西海岸早 13.5 个小时。例如, 西海岸的午夜,在印度是 1:30 PM。

假设你能说服程序员们早点来上班,按他们的 时间是 7:30 AM 与你通话。那时纽约是前一天 的 9:00 PM,西海岸是前一天的 6:00 PM。 这个安排正合适,于是你把每周例会定在 西海岸的星期一 6:00 PM、纽约的星期一 9:00 PM,以及印度星期二早上的 7:30 AM。

夏天时,PST 向前调 1 小时成为 PDT,EST 向前调 1 小时成为 EDT。印度的时间不变。 查看表格并重新计算,我们会看到,在夏季, 印度只比纽约早 9.5 个小时,比西海岸早 12.5 个小时。因此,如果西海岸和纽约仍按 原来的时间开会,程序员到 8:30 AM 才需要 到场,这让他们可以多睡一个小时。

名称的由来

UTC, UT, GMT


格林尼治(Greenwich,读音为 "Gren-itch")是伦敦的一个行政区,在 1675-1985 年间是皇家天文台的所在地。 我们现代的计时与经度体系,就是在这座 天文台发展起来的。出于这个原因,那条 穿过天文台的假想南北线被定为 0 度经线。

1884 年,格林尼治的时间被采用为全球标准, 用来确定世界各地的所有时区。这种全球标准 时间称为格林尼治平时,即 GMT。(在这种 语境下,"mean" 一词指的是平均值。)GMT 在互联网上使用广泛,有时也有人用较新的、 更正式的名称 UT(Universal Time)来称呼它。

除了 UT,你还会看到另一个名称:UTC (Coordinated Universal Time)。UTC 是由 美国国家标准局和美国海军天文台计算出来的 通用时间的官方值。

你可能会纳闷:为什么 Coordinated Universal Time 的缩写是 UTC,而不是 CUT。

1970 年,UTC 被采用为正式的国际标准。 这项工作由国际电信联盟内的一批专家完成。 到了为新标准命名的时候,这批专家遇上了 一个难题。

在英语中,Coordinated Universal Time 的 缩写应当是 CUT。但在法语中,这个名称是 Temps Universel Coordonné,缩写 应当是 TUC。这批专家希望世界各地都使用 同一个缩写,却无法就究竟该用 CUT 还是 TUC 达成一致。折中的办法是采用 UTC。虽然这个 缩写在英语和法语中都不精确,它却有一个 巨大的优点:维护了和平。

(知道这件事的人并不多,不过现在你知道了。)