時區信息數據庫,又稱TZ database、Zoneinfo database,是一個主要應用於電腦程序以及操作系統的,可協作編輯世界時區信息的數據庫[2]。由於該數據庫由David Olson創立,因而有些地方也將其稱作Olson數據庫[3]。數據庫由Paul Eggert進行編輯和維護[4]。
它的顯著特色是由上面提到的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/Argentina/...」、「America/Kentucky/...」、「America/Indiana/...」和「America/North_Dakota/...」。
由於「地點」的命名會選取這個區域具有代表性的名稱,因而不是每個城市都有一個以它命名的時區,例如沒有「America/Boston」這個時區。此外,數據庫中不同位置儘管有不同的名稱,它們也有可能目前擁有同一個時區,例如一些歷史上曾經分處不同時區(「America/Detroit」和「America/New_York」)和一些在不同國家的位置(「Europe/Prague」和「Europe/Bratislava」)。
時區數據
對於那些有多個時間偏移(通常指的是標準情況和夏令時情況下兩個變量)的時區,時區信息數據庫會記錄準確的偏移變換時刻。數據記錄的格式也可以將轉換過程中日期和時間的變化記錄起來。
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).
譯文
文件中的表格包含以下幾列:
- 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年之前的數據需要修正的原因之一[12]。
以柏林時間(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衍生操作系統,包括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及更高版本[14][15](自AIX 5.2開始的較早版本,僅為支持MySQL[16]之類的第三方軟件而加入時區信息[17],但其並未將時區信息應用到操作系統中[17][18]。);
- 一些其他的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)以後的發行版[19];
- PostgreSQL 8.0 (2005)以後的版本;
- 嵌入式軟件,例如IP鐘錶中的固件。
通用當地數據儲存庫和國際統一碼部件採納了Olson時區編號被採納。例如,這裡 (頁面存檔備份,存於網際網路檔案館)是微軟Windows操作系統中的時區ID與Olson標準名稱的映射關係。
另見
參考文獻
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.