IANA Time Zone Database 和 ZONEINFO 詳解
Time Zone Database
IANA Time Zone Database,簡(jiǎn)稱(chēng) tz 或 zoneinfo,是一組表示地球上各地的時(shí)間歷史的代碼和數(shù)據(jù),由互聯(lián)網(wǎng)號(hào)碼分配機(jī)構(gòu)(Internet Assigned Numbers Authority,IANA)維護(hù)。該數(shù)據(jù)庫(kù)包含了全球各國(guó)的時(shí)間信息,包括時(shí)區(qū)邊界、UTC(世界標(biāo)準(zhǔn)時(shí)間)和夏令時(shí)等規(guī)則。IANA會(huì)根據(jù)各地政體的變化而定期更新關(guān)于時(shí)區(qū)邊界、UTC和夏令時(shí)等的規(guī)則。該數(shù)據(jù)庫(kù)是用于實(shí)現(xiàn)網(wǎng)絡(luò)上的時(shí)間同步和計(jì)算的必要條件,也為開(kāi)發(fā)者和用戶(hù)提供了方便的時(shí)間轉(zhuǎn)換工具。
IANA Time Zone Database 的各個(gè)版本可以到如下地址下載https://data.iana.org/time-zones/releases/。
ZONEINFO
ZONEINFO是IANA Time Zone Database 時(shí)區(qū)數(shù)據(jù)庫(kù)的一種格式,也稱(chēng)為“tz數(shù)據(jù)庫(kù)”或“Olson數(shù)據(jù)庫(kù)”,用于表示世界各個(gè)國(guó)家和地區(qū)的時(shí)區(qū)和夏令時(shí)信息。ZONEINFO格式的文件通常具有一個(gè)".tz"、".tzdb" 或 ".zoneinfo"的文件擴(kuò)展名。
ZONEINFO格式的文件包含了當(dāng)前的時(shí)區(qū)和夏令時(shí)規(guī)則,以及發(fā)生在過(guò)去和未來(lái)的時(shí)間更改記錄。在這些文件中,以普通文本格式保存了各種國(guó)家和地區(qū)的標(biāo)準(zhǔn)時(shí)間和夏令時(shí)的歷史記錄。ZONEINFO格式的文件的優(yōu)勢(shì)在于它可以被輕松地更新,使得它能夠及時(shí)反映出國(guó)家或地區(qū)的時(shí)區(qū)更改。以美國(guó)為例,夏令時(shí)規(guī)則近年來(lái)經(jīng)常發(fā)生變化,而ZONEINFO格式的文件可以及時(shí)地更新這些變化,使得相關(guān)的操作系統(tǒng)和應(yīng)用程序能夠順利地進(jìn)行時(shí)區(qū)的轉(zhuǎn)換和處理。
用戶(hù)可以使用 ZONEINFO 格式的文件來(lái)實(shí)現(xiàn)時(shí)區(qū)轉(zhuǎn)換和處理,在許多操作系統(tǒng)和編程語(yǔ)言中都有相關(guān)的庫(kù)支持。zoneinfo 在 Linux 系統(tǒng)中位置一般如下:/usr/share/zoneinfo ,在 MacOS 系統(tǒng)中位置一般如下:/var/db/timezone/zoneinfo。目錄中包含多個(gè)文件,每個(gè)文件都對(duì)應(yīng)著一個(gè)時(shí)區(qū)。這些文件的名稱(chēng)通?;诘乩砦恢没驀?guó)家名稱(chēng),例如 America/New_York 和 Asia/Shanghai 等。在每個(gè) zoneinfo 文件中,包含了有關(guān)該地區(qū)時(shí)區(qū)規(guī)則的信息,例如時(shí)區(qū)名稱(chēng)、UTC 偏移量、夏令時(shí)規(guī)則、歷史更改記錄等。
zoneinfo 文件通常由相關(guān)操作系統(tǒng)或軟件管理,例如 Unix 和 Linux 操作系統(tǒng)中的 tzdata 包。隨著時(shí)區(qū)更改不斷發(fā)生,這些文件也需保持不斷的更新,以反映出最新的時(shí)區(qū)信息和規(guī)則。
因?yàn)?zoneinfo 文件包含有關(guān)時(shí)區(qū)規(guī)則的信息,所以它們?cè)趹?yīng)用程序中非常有用。例如,當(dāng)應(yīng)用程序需要將 UTC 時(shí)間轉(zhuǎn)換為本地時(shí)間時(shí),它首先會(huì)使用系統(tǒng)中的 zoneinfo 文件來(lái)確定本地時(shí)區(qū)的偏移量和夏令時(shí)規(guī)則,然后應(yīng)用這些規(guī)則來(lái)計(jì)算出本地時(shí)間。
看個(gè)例子
如下代碼,輸出一下當(dāng)前的紐約時(shí)間:
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
loc, err := time.LoadLocation("America/New_York")
if err != nil {
panic(err)
}
date := t.In(loc).Format(time.RFC3339)
fmt.Println(date)
}
time.LoadLocation 方法加載的紐約時(shí)區(qū)信息,首先會(huì)從 ZONEINFO 環(huán)境變量對(duì)應(yīng)的地址里面查找,如果沒(méi)有的話(huà)會(huì)從操作系統(tǒng)標(biāo)準(zhǔn)安裝位置查找,例如上文提到的 /usr/share/zoneinfo 和 /var/db/timezone/zoneinfo。