[インデックス 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
形式に変換するプロセスを自動化します。
このスクリプトは、ダウンロードするタイムゾーンデータのバージョンを指定するための変数(CODE
と DATA
)を含んでいます。
技術的詳細
このコミットの技術的な核心は、Go言語の time
パッケージが使用するタイムゾーンデータのバージョンを、IANA Time Zone Databaseの最新版に同期させることです。これは、lib/time/update.bash
スクリプト内のバージョン指定を変更し、その結果として生成される zoneinfo.zip
ファイルを更新することで実現されます。
具体的には、update.bash
スクリプト内で、タイムゾーンデータのバージョンを示す CODE
と DATA
の変数が、以前のバージョン(CODE=2011i
, DATA=2011n
)から 2013b
に変更されています。この変更により、スクリプトが実行される際に、IANAのサーバーからバージョン2013bのタイムゾーンデータがダウンロードされ、Goの内部形式に変換されて zoneinfo.zip
が再生成されます。
zoneinfo.zip
はバイナリファイルであり、その内容が直接変更されるわけではありませんが、update.bash
スクリプトの実行によってその内容が新しいタイムゾーンデータで上書きされます。コミットログには Bin 370359 -> 374065 bytes
とあり、ファイルサイズが増加していることから、新しいタイムゾーンデータが追加されたり、既存のデータが更新されたりしたことがわかります。
この更新プロセスは、Go言語のビルドシステムに統合されており、Goの新しいバージョンがリリースされる際に、最新のタイムゾーンデータが常に含まれるようにしています。これにより、Goアプリケーションは、オペレーティングシステムに依存することなく、正確なタイムゾーン情報にアクセスできます。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更は、以下の2つのファイルに集中しています。
-
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
-
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
を利用することで、最新のタイムゾーン情報に基づいて時刻を正確に処理できるようになります。
関連リンク
- IANA Time Zone Database: https://www.iana.org/time-zones
- Go言語の
time
パッケージに関するドキュメント: https://pkg.go.dev/time (GoのバージョンによってURLが異なる場合があります)
参考にした情報源リンク
- IANA Time Zone Database 公式ウェブサイト: https://www.iana.org/time-zones
- Wikipedia - IANA Time Zone Database: https://ja.wikipedia.org/wiki/IANA%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9
- Go言語のソースコード (GitHub): https://github.com/golang/go
- Go言語のコードレビューシステム (Gerrit): https://go.dev/cl/8293043 (コミットメッセージに記載されているリンク)