今回はタイムゾーンファイルの構造をgolang標準ライブラリのloadZoneData関数から勉強してみました。

最初の4byteはマジックナンバーでTZifが入ります。これが入っていなければ正しいタイムゾーン情報ファイルではないためエラーになります。

ファイルフォーマットを表すバージョン1byte+将来のための予約の15byteの領域をスキップします

ファイルフォーマットのバージョンは\0、2、3のいずれかになるので、適切な値が入っているかのチェックも行っています。

次にlong型の4byteの値を6つ取得します。これらは順に以下の値になります。

  • UTC/local インジケータ (indicator) の個数。
  • standard/wall インジケータの個数。
  • 閏秒データの個数。
  • 「遷移時間 (transition time)」データの個数。
  • 「ローカル時間種別 (local time types)」データの個数 (0 であってはいけない)。
  • 「タイムゾーン略式文字列 (timezone abbreviation string)」の個数。

データを順に読み込みます。

タイムゾーン情報を格納します。

最初の4byteはGMTからのオフセット。次の1byteはDST(夏時間)かどうかのフラグで、最後の1byteはタイムゾーン略式文字列の配列(データ上はNULL区切り)に対するINDEXになります。byteStringはNULLまでの文字列を表示する関数です。

次に遷移時間の情報を格納します。

最後に今のタイムゾーン設定の値をキャッシュして値を返します。

参考URL