為什麼 zone.tab 缺少這麼多時區?
在典型的 nix 機器上(在 /user/share/zoneinfo 中)有超過一千個時區文件。它們中的許多僅在歷史日期上有所不同,這與只關心最近日期的程序幾乎沒有相關性 - 甚至只關心目前時間。但無論如何,它們有很多*,通過設置 TZ 環境變數來選擇它們中的任何一個作為系統的時區以及將它們中的任何一個用於特定的程序或 shell 都是完全合法的。它們都是有效的。
然後是 zone.tab 文件 (/usr/share/zoneinfo/zone.tab)。它僅列出了 400 多個時區(我的系統上為 414 個)。它缺少很多時區。那麼,問題是為什麼?為什麼他們都不在裡面?既然它們並不都在裡面,那麼如何決定將哪些放進去呢?
zone.tab 確實包含國家程式碼以及它列出的每個時區的經度和緯度(這可能是文件存在的原因),並且並非所有時區都真正具有這些(例如,UTC 沒有那些,並且它不在 zone.tab 中),所以很明顯,並非每個時區都可以在 zone.tab 中列出。但是為什麼文件中沒有列出所有與實際城市或地區相對應的城市或地區(正如大多數人所做的那樣)?為什麼只有 414 而不是實際可用的 1000+?
一個標題為重新請求包含 zone.tab的執行緒提供了一些關於
zone.tab
其用途的解釋。它的主要用途似乎是顯示城市及其位置的地圖,以允許使用者通過點擊他們附近的城市來選擇他們的時區。
考慮到這一點,它不需要知道每個城市的所有別名,知道一種首選的引用方式就足夠了。(但看起來它總是包含每個國家/地區至少一個城市。)
每個區域的其他別名儲存在tzdata原始碼中。
例如,該
backward
文件有Link Asia/Kolkata Asia/Calcutta
以便人們可以使用新拼寫或舊拼寫。
中的所有其他文件
/usr/share/zoneinfo
都是使用此原始碼生成的zic
。但是沒有 600 多個別名,那麼為什麼會有很大的不同呢?
每個時區通常會生成三個版本:
posix
、right
和您系統的預設值。$ cd /usr/share/zoneinfo $ find right -type f | wc -l 581 $ find posix -type f | wc -l 581 $ find . \( -name posix -o -name right \) -prune -o -type f | wc -l 586
tzcode顯示了這些是
Makefile
如何生成的,並提到了它們的原因:posix
忽略閏秒,right
包括它們。也可以看看: