時區資訊資料庫

**時區資訊資料庫**，又稱 **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」，意為協調世界時（**C**oordinated **U**niversal **T**ime）。為了與 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 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. `TZ` 環境變數中使用的時區名稱。
4. 註解，當且僅當該國家有多行記錄時存在。

列之間以一個定位字元分隔。
表格首先依據國家進行排序，對同一國家內部的不同記錄，以下列方式進行排序：

**(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 的軟體發行商編譯、打包後成為發行版本中的一部分。終端使用者可以通過對發行版本的升級來更新資料庫，當然這樣更新會有一些滯後，或者直接從 ftp://elsie.nci.nih.gov/pub/ 獲得原始碼，自己編譯生成二進位檔案。基於類似原則的一個未來維護計劃 （頁面存檔備份，存於網際網路檔案館）已經由網際網路號碼分配局起草完成。

## 其他標準下的應用

通用當地數據儲存庫使用 UN/LOCODE 對區域進行判斷 [1] （頁面存檔備份，存於網際網路檔案館）。這意味著字元將與國家對應，這是時區資訊資料庫想要避免的狀況。

## 軟體系統中的應用

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

* 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 標準名稱的對映關係。

## 另見

* 時區
* 夏時制

## 參考文獻

## 外部連結

* 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