zdumpはこれらのすべての時間変換をどこで取得しますか?

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タイムスタンプは未来。私より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年以前)を符号なし値として誤って解釈しているためです。

関連情報