私は最近いくつかのコードを書いています。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タイムスタンプは未来。私よりtzデータベースをよく知っている人は、この奇妙な動作を説明できますか?
答え1
Zdump は、32 ビット time_t 範囲の開始と終了で追加の偽の「スイッチ」を報告します。これは、1901と2038の値と5の代わりに7つの遷移が表示される理由を示しています。また、各切り替え直前と直後に 1 つずつペアで時間切替を報告します。したがって、7つではなく14個が得られます。
しかし、zdumpはzoneinfoファイルの内容を直接繰り返すのではなく、localtime関数を使用してさまざまなtime_t値を試すことで機能することに注意してください。このように、実際のzoneinfoファイルと同様に、POSIXスタイルのTZ指定子と連携します。 (また、デフォルトのWindowsタイムゾーン変換を報告するように変更したことがあるため、zoneinfoの内部にまったく依存しませんでした。)
すべてのツールのタイムスタンプが「将来」である理由は、負の値(Pacific / Honoluluのすべての変換は1970年以前)を符号なし値として誤って解釈しているためです。