時區資訊資料庫
時區資訊資料庫,又稱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檔案
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標準名稱的對映關係。
另見
參考文獻
- ^ Mueller, Erik. A map of the TZ timezones of the world [updated 2012-10-08; archived 2012-08-01; cited 2011-06-16].
- ^ Eggert, Paul; Olson, Arthur David. Sources for time zone and daylight saving time data. 2007-11-29 [2007-12-03]. (原始內容存檔於2012-08-01).
- ^ Olson, Arthur David. Resolved timezone issue? Other issues. New ctime manual page. tz (郵寄清單). 1986-12-16.
- ^ Eggert, Paul. Re: FW: IANA time zone registration - proposal. tz (郵寄清單). 2005-01. (原始內容存檔於2011-09-27).
- ^ Eggert, Paul. proposal for time zone names. tz (郵寄清單). 1993-10-20.
- ^ Olson, Arthur David. Re: ist of issues. tz (郵寄清單). 1987-03-18.
- ^ Devine, Bob. leap seconds; [0-60] is ok. tz (郵寄清單). 1988-06-02.
- ^ Olson, Arthur David. seismo!elsie!tz ; new versions of time zone stuff. tz (郵寄清單). 1986-11-24.
- ^ Eggert, Paul. questions and comments on http://tycho.usno.navy.mil/tzones.html. tz (郵寄清單). 1995-11-11.
- ^ zoneinfo tzcode and tzdata archives (FTP). [2007-10-30].
- ^ Theory (text file), contained in the "tzcode" distribution. Version tzcode2007h.tar.gz 2007-10-01 referenced.
- ^ Olson, Arthur David. RE: little nuance in brazil 1963. tz (郵寄清單). 2010-01-06 [2011-06-16]. (原始內容存檔於2016-04-11).
- ^ CLDR - Unicode Common Locale Data Repository. [2011-06-14]. (原始內容存檔於2011-08-07).
- ^ Olson time zone support and setup. AIX 7.1 information. IBM. [2011-03-12]. (原始內容存檔於2012-08-01).
- ^ Managing the Time Zone Variable. IBM. 2007-02-02 [2011-03-11]. (原始內容存檔於2011-07-13).
- ^ 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.0 17.1 AIX O/S updated to support 2007 Daylight Saving Time change. IBM. 2007-10-18 [2011-03-12]. (原始內容存檔於2012-08-01).
- ^ Wickremasinghe, Christopher. Introduction of daylight saving time in Western Australia 2006. AIX Wiki. IBM. 2009-03-30 [2011-03-11]. (原始內容存檔於2012-08-01).
- ^ 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).
- "tz mailing list"; archives of these messages are available at <ftp://elsie.nci.nih.gov/pub/tzarchive.gz[永久失效連結]>.
外部連結
- 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