Timezone

zdump 從哪裡獲得所有這些時間轉換?

  • June 4, 2015

我最近編寫了一些程式碼來解析來自 Olson zoneinfo 數據庫的二進制時區數據。據我所知,我的程式碼是正確的,並且符合用 C 編寫的規範。

但是,將我的工具的結果與標準工具的輸出進行比較時,我得到了不同的結果zdump!這很奇怪,因為在我看來,我們是根據數據工作的。這是我的工具產生的結果:

$ ./mytool /usr/share/zoneinfo/Pacific/Honolulu
3137684296: name:HDT   offset:-34200 DST:true  type:Wall
3139531096: name:HST   offset:-37800 DST:false type:Wall
3414769096: name:HDT   offset:-34200 DST:true  type:Wall
3529591096: name:HST   offset:-37800 DST:false type:Wall
3582817096: name:HST   offset:-36000 DST:false type:Wall

這就是zdump給我的:

$ zdump -v /usr/share/zoneinfo/Pacific/Honolulu
/usr/share/zoneinfo/Pacific/Honolulu  Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Apr 30 12:29:59 1933 UTC = Sun Apr 30 01:59:59 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Apr 30 12:30:00 1933 UTC = Sun Apr 30 03:00:00 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun May 21 21:29:59 1933 UTC = Sun May 21 11:59:59 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun May 21 21:30:00 1933 UTC = Sun May 21 11:00:00 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Feb  9 12:29:59 1942 UTC = Mon Feb  9 01:59:59 1942 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Feb  9 12:30:00 1942 UTC = Mon Feb  9 03:00:00 1942 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun Sep 30 11:29:59 1945 UTC = Sun Sep 30 01:59:59 1945 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun Sep 30 11:30:00 1945 UTC = Sun Sep 30 01:00:00 1945 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Jun  8 12:29:59 1947 UTC = Sun Jun  8 01:59:59 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Jun  8 12:30:00 1947 UTC = Sun Jun  8 02:30:00 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Jan 18 03:14:07 2038 UTC = Sun Jan 17 17:14:07 2038 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Tue Jan 19 03:14:07 2038 UTC = Mon Jan 18 17:14:07 2038 HST isdst=0

那裡有更多的數據!而且 14 行不是 5 行的倍數,所以我真的不得不問 - 它從哪裡獲取所有這些數據?是否zdump查詢我不知道的其他數據源?

奇怪的是,對於某些zoneinfo 文件,結果似乎或多或少是正確的。但對我來說奇怪的是,我報告的所有 Unix 時間戳都是在 future 中。比我更了解 tz 數據庫的人能否解釋這種奇怪的行為?

Zdump 在 32 位 time_t 範圍的開始和結束處報告了一個額外的假“轉換”。這解釋了 1901 和 2038 的值,以及為什麼它會顯示 7 個轉換而不是 5 個。它還成對報告時間轉換 - 一個緊接在每個轉換之前,一個緊接在每個轉換之後。因此你得到 14 而不僅僅是 7。

順便說一句,您應該知道 zdump 不能通過直接迭代 zoneinfo 文件的內容來工作,而是通過使用 localtime 函式嘗試各種 time_t 值來工作。通過這種方式,它與 POSIX 樣式的 TZ 說明符和實際的 zoneinfo 文件一樣好。(我也曾經修改它來報告本地 Windows 時區的轉換,所以它根本不依賴於任何 zoneinfo 內部)

您所有工具的時間戳都是“未來”的原因是因為您將負值(太平洋/檀香山的所有轉換都在 1970 年之前)誤解為無符號值。

引用自:https://unix.stackexchange.com/questions/207415