时区信息数据库

时区信息数据库,又称TZ databaseZoneinfo database,是一个主要应用于电脑程序以及操作系统的,可协作编辑世界时区信息的数据库[2]。由于该数据库由David Olson创立,因而有些地方也将其称作Olson数据库[3]。数据库由Paul Eggert进行编辑和维护[4]

tz数据库按照自1970年至今的本地时间,将世界划分为不同区域。本图是根据2012c版的数据库,对南极洲之外区域的划分[1]

它的显著特色是由上面提到的Paul Eggert设计的一套通用时区命名规则,例如"America/New_York"和"Europe/Paris"[5]。数据库试图记录自1970年(Unix元年)以来时区和城市的变化[6],并且还包含一些时间的转换,例如夏令时闰秒[7]

历史

该项目可以追溯至1986年之前[8]。项目的数据库和一些涉及到的源代码已经释放到公有领域[9]。通常,数据库会每年更新若干次,并发布变更公告[10]

时区的定义

在时区信息数据库中,“时区”被定义为自1970年当地时间统一的国家及地区[11]。这种定义方法关注于一个具有相同时间的地理区域,它与其他对时区的定义方法不同的是,其他方法关注于不同时区与本初子午线之间的时差。因而数据库中定义的每个时区都会记录一系列对协调世界时的时差,同一时区内一般会包含标准时间和夏令时两种。

时区的命名

为了更容易地理解,每个时区按照“区域/位置”格式,得到一个独有的名称,例如“America/New_York”。英文地名中的空格用下划线“_”代替,连词符“-”只在英文地名本身包含时使用。

区域

“区域”指的是大洲大洋名称以及Etc。大陆和海洋名称中包括:非洲美洲亚洲欧洲大洋洲南极洲太平洋大西洋印度洋北冰洋

Etc用作一些管理时区,具体而言例如“Etc/UTC”,意为协调世界时Coordinated Universal Time)。为了与POSIX标准统一,以“Etc/GMT”标记的时区将保留时区符号,即在格林威治时间(GMT)以西的区域的时区符号为正,以东区域符号为负。

地点

“地点”指的是是在区域中的特定地点的名称,通常是城市或小岛屿的名称。

由于政权更替以及边界的变动,国家名称不能稳定地描述一个区域,故不适合用来命名时区。相比之下,大城市的名称更加固定。然而,数据库的维护者们想为每一个国家代码添加至少一个时区,这样很多用户访问数据库的界面就能够得到优化。另外,(管理者们)还想让时区的地点在地理上更加紧凑,在未来时区可能发生的变化中,不会将原有的时区分割为不同的时区[来源请求]

通常会选择时区内一个人口多的城市作为该时区的名称,也有使用其他城市名称的情况,例如使用一些更加有名或不易引起歧义的城市作为名称[来源请求]。如果一个城市名发生了变化,则会在未来的版本中生成该城市的别名[来源请求],这样无论通过哪个名称访问,结果都会指向数据库中同一条记录。

有时候,“地点”本身也是一个复合名称,例如“America/Indiana/Indianapolis英语America/Indiana/Indianapolis”时区。目前数据库中存在的三级时区名称包括:“America/Argentina/...”、“America/Kentucky/...”、“America/Indiana/...”和“America/North_Dakota/...”。

由于“地点”的命名会选取这个区域具有代表性的名称,因而不是每个城市都有一个以它命名的时区,例如没有“America/Boston”这个时区。此外,数据库中不同位置尽管有不同的名称,它们也有可能目前拥有同一个时区,例如一些历史上曾经分处不同时区(“America/Detroit”和“America/New_York”)和一些在不同国家的位置(“Europe/Prague”和“Europe/Bratislava”)。

时区数据

对于那些有多个时间偏移(通常指的是标准情况和夏令时情况下两个变量)的时区,时区信息数据库会记录准确的偏移变换时刻。数据记录的格式也可以将转换过程中日期和时间的变化记录起来。

Zone.tab文件

zone.tab英语zone.tab文件存在于互联网中,文件格式的相关说明可参考文件中的注释,如下所示:

原文

# This file contains a table with the following columns:
# 1.  ISO 3166 2-character country code.  See the file `iso3166.tab'.
# 2.  Latitude and longitude of the zone's principal location
#     in ISO 6709 sign-degrees-minutes-seconds format,
#     either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
#     first latitude (+ is north), then longitude (+ is east).
# 3.  Zone name used in value of TZ environment variable.
# 4.  Comments; present if and only if the country has multiple rows.
#
# Columns are separated by a single tab.
# The table is sorted first by country, then an order within the country that
# (1) makes some geographical sense, and
# (2) puts the most populous zones first, where that does not contradict (1).

译文

#文件中的表格包含以下幾列:
#1.ISO 3166 2個字符的國家/地區代碼。詳見文件“iso3166.tab”。
#2.時區代表位置的經緯度。
#ISO 6709標準中為符號-度-分-秒格式,
#即±度度分分±度度度分分或±度度分分秒秒±度度度分分秒秒,
#前半部分為緯度(+為北半球),後半部分為經度(+為東半球)。
#3.時區名稱,利用時區信息數據庫中的環境變量。
#4.註解,當且僅當該國家有多行記錄時存在。
#
#列之間以一個定位字元分隔。
#表格以國家進行劃分,對國家內部的不同記錄,以下列方式進行排序
#(1)按照地理位置進行排序
#(2)在不與(1)衝突的先前下,將人口最多的區域插入首位。

1970年之前的数据

1970年之前的数据由于城市区域的变化需要进行修正,没有必要对整个区域的时区信息进行修正,这是由于新划分的区域仅需要与1970年至今的时钟进行时差比较。

例如,在1963年10月23日至1963年12月9日,巴西只有米纳斯吉拉斯Minas Gerais英语Minas Gerais)、圣埃斯皮里图州Espirito Santo英语Espirito Santo)、里约热内卢州Rio de Janeiro)和圣保罗Sao Paulo英语Sao Paulo)有夏令时,由于自1970年以来圣保罗整个区域内时钟相同,导致一个区域无法从America/Sao_Paulo英语America/Sao Paulo时区中划分出来,这是1970年之前的数据需要修正的原因之一[12]

以柏林时间(Europe/Berlin英语Europe/Berlin)为准的德国标准时间,在1945年之后的英、美、苏三国共同占领区域则是一段时间并未按照柏林时间进行夏令时变换[来源请求]

文件格式

时区信息数据库(Tz database)以文本文件的形式发布,文件以可阅读的形式记录了的条目规则和时区过渡信息。为便于使用,这些文本文件被编译为与操作系统无关的二进制文件,每个时区对应一个文件。相关的代码包括,被称为zic(Zone Information Compiler,时区信息编译器),以及用来读取其他文件,并将文件中的时区信息应用于应用程序接口(例如localtime()mktime())。

维护

时区信息相关的代码和数据库由一群志愿者维护。Arthur David Olson侧重于代码的编辑,Paul Eggert则侧重于数据库。计划变更的条目会被送到项目的邮件列表中,在Usenet的comp.time.tz讨论组中。项目源文件发布在FTP服务器elsie.nci.nih.gov上,这些源文件被类似于Debian的软件发行商编译、打包后成为发行版本中的一部分。终端用户可以通过对发行版本的升级来更新数据库,当然这样更新会有一些滞后,或者直接从ftp://elsie.nci.nih.gov/pub/[永久失效链接] 获得源代码,自己编译生成二进制文件。基于类似原则的一个未来维护计划页面存档备份,存于互联网档案馆)已经由互联网号码分配局起草完成。

其他标准下的应用

通用当地数据存储库[13]使用UN/LOCODE对区域进行判断[1]页面存档备份,存于互联网档案馆)。这意味着字符将与国家对应,这是时区信息数据库想要避免的状况。

软件系统中的应用

时区信息数据库用来处理时区和进行时区转换,已经应用于很多的计算机系统中,包括:

  • BSD派生操作系统,包括FreeBSDNetBSDOpenBSDDragonFly BSDMac OS X
  • GNU C 库以及使用它的系统,包括GNU、大多数的Linux发行版BeOSHaikuNexenta OS以及Cygwin
  • System V Release 4派生系统,例如SolarisUnixWare
  • AIX 6.1及更高版本[14][15](自AIX 5.2开始的较早版本,仅为支持MySQL[16]之类的第三方软件而加入时区信息[17],但其并未将时区信息应用到操作系统中[17][18]。);
  • 一些其他的Unix操作系统,包括Tru64UNICOS/mp(还有IRIX,维护而不发行);
  • OpenVMS;
  • JAVA运行时环境 1.4(2002)以后的发行版;
  • PerlDateTime::TimeZone页面存档备份,存于互联网档案馆)以及DateTime::LeapSecond页面存档备份,存于互联网档案馆)组件,2003年起;
  • PHP发行版 5.1.0(2005)及以后;
  • Python组件pytz页面存档备份,存于互联网档案馆);
  • .NET Frameworkzoneinfo页面存档备份,存于互联网档案馆)组件;
  • Oracle 10g(2004)以后的发行版[19]
  • PostgreSQL 8.0 (2005)以后的版本;
  • 嵌入式软件,例如IP钟表中的固件。

通用当地数据存储库国际统一码部件采纳了Olson时区编号被采纳。例如,这里页面存档备份,存于互联网档案馆)是微软Windows操作系统中的时区ID与Olson标准名称的映射关系。

另见

参考文献

  1. ^ Mueller, Erik. A map of the TZ timezones of the world [updated 2012-10-08; archived 2012-08-01; cited 2011-06-16].
  2. ^ Eggert, Paul; Olson, Arthur David. Sources for time zone and daylight saving time data. 2007-11-29 [2007-12-03]. (原始内容存档于2012-08-01). 
  3. ^ Olson, Arthur David. Resolved timezone issue? Other issues. New ctime manual page. tz (邮件列表). 1986-12-16. 
  4. ^ Eggert, Paul. Re: FW: IANA time zone registration - proposal. tz (邮件列表). 2005-01. (原始内容存档于2011-09-27). 
  5. ^ Eggert, Paul. proposal for time zone names. tz (邮件列表). 1993-10-20. 
  6. ^ Olson, Arthur David. Re: ist of issues. tz (邮件列表). 1987-03-18. 
  7. ^ Devine, Bob. leap seconds; [0-60] is ok. tz (邮件列表). 1988-06-02. 
  8. ^ Olson, Arthur David. seismo!elsie!tz ; new versions of time zone stuff. tz (邮件列表). 1986-11-24. 
  9. ^ Eggert, Paul. questions and comments on http://tycho.usno.navy.mil/tzones.html. tz (邮件列表). 1995-11-11. 
  10. ^ zoneinfo tzcode and tzdata archives (FTP). [2007-10-30]. 
  11. ^ Theory (text file), contained in the "tzcode" distribution. Version tzcode2007h.tar.gz 2007-10-01 referenced.
  12. ^ Olson, Arthur David. RE: little nuance in brazil 1963. tz (邮件列表). 2010-01-06 [2011-06-16]. (原始内容存档于2016-04-11). 
  13. ^ CLDR - Unicode Common Locale Data Repository. [2011-06-14]. (原始内容存档于2011-08-07). 
  14. ^ Olson time zone support and setup. AIX 7.1 information. IBM. [2011-03-12]. (原始内容存档于2012-08-01). 
  15. ^ Managing the Time Zone Variable. IBM. 2007-02-02 [2011-03-11]. (原始内容存档于2011-07-13). 
  16. ^ 2007 daylight savings time changes for Unix. Academic Computing and Communications Center, University of Illinois at Chicago. 2007-02-25 [2008-03-18]. (原始内容存档于2012-08-01). )
  17. ^ 17.0 17.1 AIX O/S updated to support 2007 Daylight Saving Time change. IBM. 2007-10-18 [2011-03-12]. (原始内容存档于2012-08-01). 
  18. ^ Wickremasinghe, Christopher. Introduction of daylight saving time in Western Australia 2006. AIX Wiki. IBM. 2009-03-30 [2011-03-11]. (原始内容存档于2012-08-01). 
  19. ^ Oracle Database Globalization Support Guide 10g Release 1 (10.1): Chapter 4, Section "Choosing a Time Zone File". Oracle Corporation. June 2004: 4–14 [2007-10-30]. Part No. B10749-02. (原始内容存档于2008-12-01). 

外部链接