Timezone
zdump 從哪裡獲得所有這些時間轉換?
我最近編寫了一些程式碼來解析來自 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 年之前)誤解為無符號值。