時區資訊資料庫

<image>

時區資訊資料庫，又稱TZ database、Zoneinfo database，是一個主要應用於電腦程式以及作業系統的，可協作編輯世界時區資訊的資料庫。由於該資料庫由David Olson創立，因而有些地方也將其稱作Olson資料庫。資料庫由Paul Eggert進行編輯和維護。

它的顯著特色是由上面提到的Paul Eggert設計的一套通用時區命名規則，例如"America/New_York"和"Europe/Paris"。資料庫試圖記錄自1970年（Unix元年）以來時區和城市的變化，並且還包含一些時間的轉換，例如夏令時和閏秒。

## 歷史

該項目可以追溯至1986年之前。項目的資料庫和一些涉及到的原始碼已經釋放到公有領域。通常，資料庫會每年更新若干次，並發布變更公告。

## 時區的定義

在時區資訊資料庫中，「時區」被定義為自1970年當地時間統一的國家及地區。這種定義方法關注於一個具有相同時間的地理區域，它與其他對時區的定義方法不同的是，其他方法關注於不同時區與本初子午線之間的時差。因而資料庫中定義的每個時區都會記錄一系列對協調世界時的時差，同一時區內一般會包含標準時間和夏令時兩種。

## 時區的命名

為了更容易地理解，每個時區按照「區域/位置」格式，得到一個獨有的名稱，例如「America/New_York」。英文地名中的空格用下劃線「_」代替，連詞符「-」只在英文地名本身包含時使用。

### 區域

「區域」指的是大洲、大洋名稱以及Etc。大陸和海洋名稱中包括：非洲、美洲、亞洲、歐洲、大洋洲、南極洲，太平洋、大西洋、印度洋、北冰洋。

Etc用作一些管理時區，具體而言例如「Etc/UTC」，意為協調世界時（Coordinated Universal Time）。為了與POSIX標準統一，以「Etc/GMT」標記的時區將保留時區符號，即在格林威治時間（GMT）以西的區域的時區符號為正，以東區域符號為負。

### 地點

「地點」指的是是在區域中的特定地點的名稱，通常是城市或小島嶼的名稱。

由於政權更替以及邊界的變動，國家名稱不能穩定地描述一個區域，故不適合用來命名時區。相比之下，大城市的名稱更加固定。然而，資料庫的維護者們想為每一個國家代碼添加至少一個時區，這樣很多用戶訪問資料庫的界面就能夠得到優化。另外，（管理者們）還想讓時區的地點在地理上更加緊湊，在未來時區可能發生的變化中，不會將原有的時區分割為不同的時區。

通常會選擇時區內一個人口多的城市作為該時區的名稱，也有使用其他城市名稱的情況，例如使用一些更加有名或不易引起歧義的城市作為名稱。如果一個城市名發生了變化，則會在未來的版本中生成該城市的別名，這樣無論通過哪個名稱訪問，結果都會指向資料庫中同一條記錄。

有時候，「地點」本身也是一個複合名稱，例如「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文件存在於網際網路中，文件格式的相關說明可參考文件中的注釋，如下所示：

原文

```
# This file contains a table with the following columns:
# 1.  [[ISO 3166-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).
```

譯文

文件中的表格包含以下幾列：

- ISO 3166 2個字符的國家/地區代碼。詳見文件「iso3166.tab」。
- 時區代表位置的經緯度，使用ISO 6709標準（符號-度-分-秒）格式表示，即±度度分分±度度度分分或±度度分分秒秒±度度度分分秒秒。前半部分為緯度（北半球為正數），後半部分為經度（東半球為正數）。
- `TZ`環境變量中使用的時區名稱。
- 註解，當且僅當該國家有多行記錄時存在。

列之間以一個定位字元分隔。

表格首先依據國家進行排序，對同一國家內部的不同記錄，以下列方式進行排序：

(1) : 按照地理位置進行排序

(2) : 在不與(1)衝突的先前下，將人口最多的區域插入首位。

## 1970年之前的數據

1970年之前的數據由於城市區域的變化需要進行修正，沒有必要對整個區域的時區資訊進行修正，這是由於新劃分的區域僅需要與1970年至今的時鐘進行時差比較。

例如，在1963年10月23日至1963年12月9日，巴西只有米納斯吉拉斯（Minas Gerais）、聖埃斯皮里圖州（Espirito Santo）、里約熱內盧州（Rio de Janeiro）和聖保羅（Sao Paulo）有夏令時，由於自1970年以來聖保羅整個區域內時鐘相同，導致一個區域無法從America/Sao_Paulo時區中劃分出來，這是1970年之前的數據需要修正的原因之一。

以柏林時間（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的軟體發行商編譯、打包後成為發行版本中的一部分。終端用戶可以通過對發行版本的升級來更新資料庫，當然這樣更新會有一些滯後，或者直接從 獲得原始碼，自己編譯生成二進位文件。基於類似原則的一個 未來維護計劃 已經由網際網路號碼分配局起草完成。

## 其他標準下的應用

通用當地數據儲存庫使用UN/LOCODE對區域進行判斷。這意味著字符將與國家對應，這是時區資訊資料庫想要避免的狀況。

## 軟體系統中的應用

時區資訊資料庫用來處理時區和進行時區轉換，已經應用於很多的電腦系統中，包括：

- BSD衍生作業系統，包括FreeBSD、NetBSD、OpenBSD、DragonFly BSD和Mac OS X。
- GNU C 庫以及使用它的系統，包括GNU、大多數的Linux發行版、BeOS、Haiku、Nexenta OS以及Cygwin。
- System V Release 4衍生系統，例如Solaris和UnixWare。
- AIX 6.1及更高版本（自AIX 5.2開始的較早版本，僅為支持MySQL之類的第三方軟體而加入時區資訊，但其並未將時區資訊應用到作業系統中。）。
- 一些其他的Unix作業系統，包括Tru64和UNICOS/mp（還有IRIX，維護而不發行）。
- OpenVMS;
- JAVA運行時環境 1.4（2002）以後的發行版。
- Perl的 DateTime::TimeZone 以及 DateTime::LeapSecond 組件，2003年起。
- PHP發行版 5.1.0（2005）及以後。
- Python組件 pytz。
- .NET Framework的 zoneinfo 組件。
- Oracle 10g（2004）以後的發行版。
- PostgreSQL 8.0 （2005）以後的版本。
- 嵌入式軟體，例如IP鐘錶中的固件。

通用當地數據儲存庫和國際統一碼部件採納了Olson時區編號被採納。例如，這裡 是微軟Windows作業系統中的時區ID與Olson標準名稱的映射關係。

## 參考文獻

- "tz mailing list"; archives of these messages are available at .

## 外部連結

- ITU LEGAL TIME 2011
- The tz database home page
- The tz mailing list archive
- Current tz source and data raw files
- Current tz data files compiled to multiple formats
- Lists of tz-zones by tz-group
- The tz database converted to SQL format
- Olson Database converted to Windows Standard Format
- 「A literary appreciation of the Olson/Zoneinfo/tz database」 by Jon Udell