Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 16060] ファイルの概要

このコミットは、Go言語の標準ライブラリである lib/time パッケージにおけるタイムゾーンデータを、IANA Time Zone Databaseのバージョン2013bに更新するものです。これにより、最新のタイムゾーン規則がGoアプリケーションに適用され、正確な時刻計算が保証されます。

コミット

commit 26e0ddcf2a0de1fbbed87cfe1f33d18731813a0c
Author: Rob Pike <r@golang.org>
Date:   Tue Apr 2 16:49:45 2013 -0700

    lib/time: update time zone to IANA version 2013b
    Update #4553.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/8293043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/26e0ddcf2a0de1fbbed87cfe1f33d18731813a0c

元コミット内容

lib/time: update time zone to IANA version 2013b
Update #4553.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/8293043

変更の背景

タイムゾーンの規則は、各国の政府や国際機関の決定により頻繁に変更されます。例えば、夏時間(Daylight Saving Time, DST)の開始・終了日の変更、標準時のオフセット変更、あるいは新しいタイムゾーンの導入などがあります。これらの変更は、正確な時刻表示や時間計算を必要とするソフトウェアにとって非常に重要です。

Go言語の time パッケージは、これらのタイムゾーン情報を IANA Time Zone Database (tzdata) から取得し、zoneinfo.zip という形式で内部に保持しています。このデータベースは定期的に更新されるため、Go言語のライブラリもそれに合わせて更新する必要があります。

このコミットは、IANA Time Zone Databaseがバージョン2013bに更新されたことに伴い、Goの lib/time パッケージがその最新の変更を反映するように行われました。これにより、Goアプリケーションが常に最新かつ正確なタイムゾーン情報に基づいて動作することが保証されます。コミットメッセージにある Update #4553 は、この更新が特定の課題やバグ報告に対応するものであることを示唆しています。

前提知識の解説

IANA Time Zone Database (tzdata)

IANA Time Zone Database(以前はOlson databaseとして知られていました)は、世界のタイムゾーンと夏時間(DST)の歴史的な変化に関する情報を集約した公開データベースです。このデータベースは、オペレーティングシステムやプログラミング言語(Go、Java、PHPなど)が正確な時刻計算を行うために広く利用されています。

データベースは、タイムゾーンの定義、UTCからのオフセット、夏時間の規則、およびそれらの変更履歴を詳細に記録しています。これにより、過去、現在、未来の任意の時点における正確なローカルタイムを計算することが可能になります。

zoneinfo.zip

Go言語の time パッケージは、IANA Time Zone Databaseの情報を zoneinfo.zip というZIPアーカイブ形式でバンドルしています。このファイルには、タイムゾーンデータがコンパイルされたバイナリ形式で含まれており、Goプログラムが実行時にタイムゾーン情報を効率的にロードできるように設計されています。

zoneinfo.zip は、Goのビルドプロセスの一部として生成または更新され、Goの標準ライブラリの一部として配布されます。

lib/time/update.bash

lib/time/update.bash は、Go言語の time パッケージがIANA Time Zone Databaseを更新するために使用するシェルスクリプトです。このスクリプトは、IANAの公式ソースから最新のタイムゾーンデータをダウンロードし、それをGoが利用できる zoneinfo.zip 形式に変換するプロセスを自動化します。

このスクリプトは、ダウンロードするタイムゾーンデータのバージョンを指定するための変数(CODEDATA)を含んでいます。

技術的詳細

このコミットの技術的な核心は、Go言語の time パッケージが使用するタイムゾーンデータのバージョンを、IANA Time Zone Databaseの最新版に同期させることです。これは、lib/time/update.bash スクリプト内のバージョン指定を変更し、その結果として生成される zoneinfo.zip ファイルを更新することで実現されます。

具体的には、update.bash スクリプト内で、タイムゾーンデータのバージョンを示す CODEDATA の変数が、以前のバージョン(CODE=2011i, DATA=2011n)から 2013b に変更されています。この変更により、スクリプトが実行される際に、IANAのサーバーからバージョン2013bのタイムゾーンデータがダウンロードされ、Goの内部形式に変換されて zoneinfo.zip が再生成されます。

zoneinfo.zip はバイナリファイルであり、その内容が直接変更されるわけではありませんが、update.bash スクリプトの実行によってその内容が新しいタイムゾーンデータで上書きされます。コミットログには Bin 370359 -> 374065 bytes とあり、ファイルサイズが増加していることから、新しいタイムゾーンデータが追加されたり、既存のデータが更新されたりしたことがわかります。

この更新プロセスは、Go言語のビルドシステムに統合されており、Goの新しいバージョンがリリースされる際に、最新のタイムゾーンデータが常に含まれるようにしています。これにより、Goアプリケーションは、オペレーティングシステムに依存することなく、正確なタイムゾーン情報にアクセスできます。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更は、以下の2つのファイルに集中しています。

  1. lib/time/update.bash:

    --- a/lib/time/update.bash
    +++ b/lib/time/update.bash
    @@ -7,8 +7,8 @@
     # downloaded from the ICANN/IANA distribution.
     
     # Versions to use.
    -CODE=2011i
    -DATA=2011n
    +CODE=2013b
    +DATA=2013b
     
     set -e
     rm -rf work
    
  2. lib/time/zoneinfo.zip:

    --- a/lib/time/zoneinfo.zip
    +++ b/lib/time/zoneinfo.zip
    index b542132392..c10a42576e 100644
    Binary files a/lib/time/zoneinfo.zip and b/lib/time/zoneinfo.zip differ
    

    このファイルはバイナリファイルであるため、差分は表示されませんが、内容が更新されたことが示されています。

コアとなるコードの解説

lib/time/update.bash の変更

lib/time/update.bash スクリプトは、IANA Time Zone Databaseのデータを取得し、Go言語の time パッケージが利用できる形式に変換するためのものです。このスクリプト内の以下の行が変更されました。

-CODE=2011i
-DATA=2011n
+CODE=2013b
+DATA=2013b
  • CODE: これは、IANA Time Zone Databaseのソースコード(tzcode)のバージョンを指定します。tzcode には、タイムゾーンデータをコンパイルするためのツールやスクリプトが含まれています。
  • DATA: これは、IANA Time Zone Databaseの実際のタイムゾーンデータ(tzdata)のバージョンを指定します。tzdata には、各タイムゾーンの規則、オフセット、夏時間情報などが含まれています。

これらの変数を 2013b に更新することで、update.bash スクリプトが実行された際に、IANAの公式サーバーからバージョン2013bのタイムゾーンデータがダウンロードされ、それに基づいて zoneinfo.zip が再生成されるようになります。

lib/time/zoneinfo.zip の変更

zoneinfo.zip は、Go言語の time パッケージが実行時にタイムゾーン情報をロードするために使用するバイナリデータファイルです。update.bash スクリプトの実行により、このファイルの内容が新しいタイムゾーンデータで上書きされます。

コミットログに Binary files a/lib/time/zoneinfo.zip and b/lib/time/zoneinfo.zip differ とあるように、このファイルは変更されています。これは、新しいタイムゾーン規則や変更が zoneinfo.zip に反映されたことを意味します。Goアプリケーションは、この更新された zoneinfo.zip を利用することで、最新のタイムゾーン情報に基づいて時刻を正確に処理できるようになります。

関連リンク

参考にした情報源リンク