我的 zoneinfo 是倒退還是我很困惑
據我所知,美國東部時間是東部標準時間的 GMT-5 和東部夏令時間的 GMT-4。
那麼為什麼這兩個命令在答案中給出不同的時間呢?
laptop % TZ=EST5EDT date Wed Apr 27 12:16:36 EDT 2022 laptop % TZ=GMT-4 date Wed Apr 27 20:16:40 GMT 2022
他們不應該是一樣的嗎?
實際上有兩種主要的方式來使用 TZ 變數。較舊的在 POSIX 標準中指定,它可以在實際變數中編碼時區和當年的夏令時規則。例如,歐洲 UTC+2 小時時區可能完全指定為以下 POSIX 樣式:
TZ=EET-2EEST,M3.5.0/3,M10.5.0/4
- EET =“標準時間”時區 ID(“東歐時間”)
- -2 = 您必須添加到本地時間才能獲得 UTC 的偏移量
- EEST = DST 時區 ID(“東歐夏令時間”)
- M3.5.0/3 = DST 於當地時間 3 月最後一個星期日 03:00:00 生效
- M10.5.0/4 = 標準時間恢復 10 月最後一個星期日,當地時間 04:00:00
請注意,此格式假定目前年份的 DST 規則也適用於任何過去和未來的年份……這種假設不太可能是正確的。
由於這顯然不太理想,許多 unix 風格的作業系統使用 TZ 環境變數作為對更擴展時區資訊表的引用,涵蓋特定時區的目前和歷史定義。
這些基於表的實現中最全面的是 Olson 時區資訊數據庫,現在由 IANA 維護。Olson 風格的 TZ 值通常採用
<Continent>/<City>
格式,但數據庫也有一些其他選項。您可以在 TZ 變數中使用任何一種形式,但如果值不明確,則 POSIX 格式優先,因為它是已建立的標準。TZ 變數的 POSIX 標准定義是您可能自然假設的“倒退”。第一個時區標籤後面的數字標識您必須添加到本地時間才能獲得UTC 時間的小時數。
這可能是因為在開發 POSIX 標準之前,已經存在不同版本的 TZ 環境變數約定……並且由於 Unix 最初是在西半球開發的,現有的約定傾向於使用美國時區的正數。(在 Unix 的早期,沒有人可能猜到 MULTICS OS 開發項目的主要學術分支會成長為更大、更長壽的東西。)
我了解到,POSIX 規範的開發人員盡其所能找到已經最常見的行為,並將其編入標準,除非有非常明顯的理由不這樣做。
因此,
TZ=GMT-4
以 POSIX 風格進行解釋……然後它並不意味著“格林威治標準時間減去四個小時的時區”:它實際上意味著“比 UTC 提前四個小時並命名為GMT 的時區”。我猜你可以隨意呼叫你的自定義時區,但是將一個眾所周知的歷史時區標識符重新用於完全不同的東西會引起混亂。如果您想在 Linux 中僅通過“GMT”來指定時區,那麼您應該通過添加
Etc/
前綴來使用更新的 Olson 風格的 TZ 設置……即使這樣,符號約定也與您所期望的相反,可能是保持與舊 POSIX 樣式設置的類比。相比:
$ TZ=Etc/GMT-4 date Wed 27 Apr 21:09:32 +04 2022 # Olson: 4 hours east of UTC, timezone correctly identified numerically $ TZ=GMT-4 date Wed 27 Apr 21:09:50 GMT 2022 # POSIX: 4 hours east of UTC, misleading timezone identifier! $ TZ=Etc/GMT+4 date Wed 27 Apr 13:09:39 -04 2022 # Olson: 4 hours west of UTC, timezone correctly identified numerically $ TZ=GMT+4 date Wed 27 Apr 13:10:14 GMT 2022 # POSIX: 4 hours west of UTC, misleading timezone identifier! $ date -u Wed 27 Apr 17:10:25 UTC 2022 # UTC time for reference.