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

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

このコミットは、Go言語の標準ライブラリにおけるタイムゾーン情報(IANA Time Zone Database)の更新に関するものです。具体的には、lib/time/update.bashスクリプト内のバージョン指定を2014cから2014dに更新し、それに伴いlib/time/zoneinfo.zipファイルが新しいタイムゾーンデータで再生成されています。

コミット

commit aa92b3e5d4b649f630a161a50b86c456b8f40277
Author: Rob Pike <r@golang.org>
Date:   Sun Jun 1 00:15:23 2014 +0000

    lib/timezone: update to IANA 2014d
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/102040045

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

https://github.com/golang/go/commit/aa92b3e5d4b649f630a161a50b86c456b8f40277

元コミット内容

このコミットの目的は、Go言語のタイムゾーンデータをIANA Time Zone Databaseのバージョン2014dに更新することです。これは、lib/time/update.bashスクリプト内のバージョン番号を変更し、その結果としてzoneinfo.zipファイルを再生成することで実現されます。

変更の背景

タイムゾーン情報は、世界中の地域における標準時、夏時間(サマータイム)の開始・終了日時、およびそのオフセット(UTCからのずれ)を定義する非常に動的なデータです。これらの情報は、各国の政府や国際機関の決定により頻繁に変更される可能性があります。例えば、夏時間の導入・廃止、開始・終了日の変更、あるいは特定の地域のタイムゾーンの変更などです。

Go言語のtimeパッケージは、正確な時刻計算とタイムゾーン変換を提供するために、このIANA Time Zone Database(tzdata)に依存しています。このデータベースは定期的に更新されるため、Goのようなプログラミング言語のランタイムや標準ライブラリも、これらの変更を追従し、最新のタイムゾーン情報を取り込む必要があります。

このコミットが行われた2014年5月28日にリリースされたIANA Time Zone Databaseのバージョン2014dは、主にtzコードとドキュメントの更新に焦点を当てており、タイムゾーンデータ自体に実質的な変更はありませんでした。具体的には、zicユーティリティ(タイムゾーン情報をコンパイルするためのツール)が更新され、GNOMEのバグに対処するために「ビッグバン以前のタイムスタンプを含むファイルを生成しない」ようになりました。また、tz-link.htmドキュメントもGNOMEに言及するように更新されました。

Goプロジェクトは、update.bashスクリプトを使用して、IANAから提供される最新のタイムゾーンデータを定期的に取り込み、zoneinfo.zipファイルを更新しています。このコミットは、その定期的なメンテナンスプロセスの一環として行われました。

前提知識の解説

  • IANA Time Zone Database (tzdata): これは、世界中のタイムゾーンルールと歴史的な変更を記録した、公的に利用可能なデータベースです。各タイムゾーンのオフセット、夏時間のルール、およびその変更履歴が含まれています。多くのオペレーティングシステムやプログラミング言語が、正確な時刻処理のためにこのデータベースを利用しています。
  • zoneinfo.zip: Go言語のtimeパッケージがタイムゾーン情報をロードするために使用するファイルです。これは、IANA Time Zone Databaseのコンパイル済みバイナリデータを含んでいます。Goのtime.LoadLocation関数は、このzoneinfo.zipファイルやシステム上の標準的なタイムゾーン情報ディレクトリ(例: /usr/share/zoneinfo)からタイムゾーンデータを検索します。Go 1.15以降では、time/tzdataパッケージをインポートすることで、タイムゾーンデータをバイナリに直接埋め込むことも可能になっています。
  • lib/time/update.bash: Goのソースツリー内にあるシェルスクリプトで、IANA Time Zone Databaseの最新版をダウンロードし、コンパイルしてzoneinfo.zipファイルを再構築するために使用されます。このスクリプトは、iana.org/time-zonesからtzcode(タイムゾーンコード)とtzdata(タイムゾーンデータ)のアーカイブをダウンロードし、それらを処理してGoが利用できる形式のzoneinfo.zipを生成します。
  • zicユーティリティ: IANA Time Zone Databaseの一部として提供されるツールで、人間が読める形式のタイムゾーン定義ファイルを、システムが効率的に利用できるバイナリ形式にコンパイルするために使用されます。

技術的詳細

このコミットの技術的な核心は、GoのタイムゾーンデータがIANA Time Zone Databaseの特定のバージョンに厳密に紐付けられている点にあります。lib/time/update.bashスクリプトは、この紐付けを管理するための重要なツールです。

スクリプトの変更点を見ると、CODEDATAという変数が定義されており、これらがそれぞれIANA Time Zone Databaseのコードバージョンとデータバージョンを示しています。

--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -7,8 +7,8 @@
 # downloaded from the ICANN/IANA distribution.
 
 # Versions to use.
-CODE=2014c
-DATA=2014c
+CODE=2014d
+DATA=2014d

この変更は、update.bashスクリプトが次に実行される際に、IANAのウェブサイトから2014dバージョンのtzcodetzdataをダウンロードし、それらを使用してzoneinfo.zipを再構築することを保証します。

zoneinfo.zipファイル自体はバイナリファイルであるため、diffコマンドではその内容の具体的な変更は表示されず、「Binary files a/lib/time/zoneinfo.zip and b/lib/time/zoneinfo.zip differ」と表示されるのみです。しかし、update.bashのバージョン変更がトリガーとなり、新しいIANAデータに基づいてこのファイルが再生成されたことは明らかです。

この更新は、Goアプリケーションが常に最新かつ正確なタイムゾーン情報に基づいて動作することを保証するために不可欠です。特に、夏時間の変更や新しいタイムゾーンルールの導入など、世界中で発生するタイムゾーン関連のイベントにGoアプリケーションが適切に対応できるようになります。

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

このコミットにおけるコアとなるコードの変更箇所は、lib/time/update.bashファイル内の以下の2行です。

--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -7,8 +7,8 @@
 # downloaded from the ICANN/IANA distribution.
 
 # Versions to use.
-CODE=2014c
-DATA=2014c
+CODE=2014d
+DATA=2014d

また、lib/time/zoneinfo.zipファイルも変更されていますが、これはupdate.bashの変更によって再生成されたバイナリファイルであるため、具体的なコードの差分は表示されません。

コアとなるコードの解説

lib/time/update.bashスクリプトは、Goのタイムゾーンデータを管理するための自動化されたメカニズムを提供します。このスクリプト内で定義されているCODEDATA変数は、それぞれIANA Time Zone Databaseのコードとデータのバージョンを指定します。

  • CODE: IANA Time Zone Databaseのソースコード(tzcode)のバージョンを指します。これには、zicなどのタイムゾーン関連ユーティリティのソースが含まれます。
  • DATA: IANA Time Zone Databaseの実際のタイムゾーンデータ(tzdata)のバージョンを指します。これには、各タイムゾーンのルール、オフセット、夏時間の情報などが含まれます。

このコミットでは、これらの変数の値が2014cから2014dに更新されています。これは、GoプロジェクトがIANA Time Zone Databaseの最新リリース(2014d)を取り込むことを意図していることを明確に示しています。

スクリプトが実行されると、これらのバージョン番号に基づいてIANAの公式ウェブサイトから対応するtzcodetzdataのアーカイブがダウンロードされます。その後、ダウンロードされたデータとコードを使用してzoneinfo.zipファイルが再構築されます。このプロセスにより、Goのtimeパッケージが利用するタイムゾーン情報が最新の状態に保たれます。

この変更自体は非常に小さいですが、Goアプリケーションの国際化対応と正確な時刻処理において、その影響は非常に大きいです。古いタイムゾーンデータを使用していると、夏時間の切り替わりやタイムゾーンルールの変更に対応できず、時刻の表示や計算に誤りが生じる可能性があります。

関連リンク

参考にした情報源リンク