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