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

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

このコミットは、Go言語の標準ライブラリである lib/time パッケージにおけるタイムゾーン情報を、IANA (Internet Assigned Numbers Authority) のタイムゾーンデータベースのバージョン 2014b に更新するものです。これにより、世界各地の最新のタイムゾーン規則(夏時間、UTCオフセットの変更など)がGoプログラムに正確に反映されるようになります。

コミット

commit bdff7f91d8e6b9a9cd4647f473be4a4b8808b5db
Author: Robert Hencke <robert.hencke@gmail.com>
Date:   Tue Apr 29 21:41:54 2014 -0400

    lib/time: update time zone info to v.2014b
    
    Fixes #7412.
    
    LGTM=r
    R=golang-codereviews, r
    CC=golang-codereviews
    https://golang.org/cl/92850043

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

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

元コミット内容

 lib/time/update.bash  |   6 ++----\
 lib/time/zoneinfo.zip | Bin 374754 -> 352541 bytes
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/lib/time/update.bash b/lib/time/update.bash
index f24ef8204b..2680329da4 100755
--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -6,11 +6,9 @@
 # This script rebuilds the time zone files using files
 # downloaded from the ICANN/IANA distribution.
 
-# NOTE: As of Oct, 2013, the C files will not build on Macs but will build on Linux.
-
 # Versions to use.
-CODE=2013g
-DATA=2013g
+CODE=2014b
+DATA=2014b
 
 set -e
 rm -rf work
diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip
index c9181153fa..65eaddde58 100644
Binary files a/lib/time/zoneinfo.zip and b/lib/time/zoneinfo.zip differ

変更の背景

タイムゾーンの規則は、世界中の政府や地域によって頻繁に変更されます。夏時間の開始・終了日、標準時のオフセット、さらには特定の地域のタイムゾーン自体が変更されることがあります。これらの変更は、正確な時刻計算やイベントのスケジューリングを行うソフトウェアにとって非常に重要です。

Go言語の time パッケージは、これらのタイムゾーン情報を内部的に保持しており、正確な時刻処理を提供するために、IANAタイムゾーンデータベース(tzdataまたはzoneinfoとしても知られる)の最新バージョンに追随する必要があります。

このコミットは、Goが使用するタイムゾーンデータを、2014年3月25日にリリースされたIANAタイムゾーンデータベースのバージョン 2014b に更新することを目的としています。2014b リリースには、当時の最新のタイムキーピング規則が反映されており、Goアプリケーションがこれらの変更に適切に対応できるようにするために不可欠な更新でした。

前提知識の解説

IANAタイムゾーンデータベース (tzdata / zoneinfo)

IANAタイムゾーンデータベースは、世界のタイムゾーンと夏時間(DST)の規則に関する情報を集約した、協調的な公開ドメインプロジェクトです。このデータベースは、オペレーティングシステムやプログラミング言語など、多くのソフトウェアシステムで時刻と日付の計算を正確に行うために利用されています。

データベースは、各タイムゾーンの歴史的な変更を含む包括的なデータを提供します。これには、UTC(協定世界時)からのオフセット、夏時間の適用期間、および特定の地域が過去に採用したタイムゾーンの変更履歴が含まれます。このデータベースは定期的に更新され、世界中で発生するタイムゾーン規則の変更に対応しています。

Go言語におけるタイムゾーン処理

Go言語の time パッケージは、タイムゾーン情報を扱うための機能を提供します。Goは、システムにインストールされているタイムゾーン情報(通常は /usr/share/zoneinfo などに存在する)を利用するか、または zoneinfo.zip のような組み込みのタイムゾーンデータファイルを使用することができます。

zoneinfo.zip は、IANAタイムゾーンデータベースのコンパイル済みバイナリデータを含むZIPアーカイブです。Goの標準ライブラリは、このファイルを読み込むことで、システムにタイムゾーンデータが存在しない環境(例えば、一部の組み込みシステムやクロスコンパイルされたバイナリ)でも正確なタイムゾーン処理を可能にします。

lib/time/update.bash スクリプト

lib/time/update.bash は、Goの time パッケージが使用する zoneinfo.zip ファイルを更新するためのシェルスクリプトです。このスクリプトは、IANAの公式ソースから最新のタイムゾーンデータ(tzcodetzdata)をダウンロードし、それらをコンパイルして zoneinfo.zip を再構築するプロセスを自動化します。

このスクリプトは、Goのタイムゾーンデータが常に最新の状態に保たれるようにするための重要なツールであり、タイムゾーン規則の変更に対応するために定期的に実行されます。

技術的詳細

このコミットの技術的な変更は、主に2つのファイルに集中しています。

  1. lib/time/update.bash の変更: このシェルスクリプトは、IANAタイムゾーンデータベースのどのバージョンを使用するかを定義する CODEDATA 変数を保持しています。このコミットでは、これらの変数の値が 2013g から 2014b に更新されています。

    • CODE=2013g から CODE=2014b
    • DATA=2013g から DATA=2014b へ これにより、update.bash スクリプトが実行される際に、IANAのサーバーから 2014b バージョンのタイムゾーンコードとデータがダウンロードされ、Goの zoneinfo.zip がこの新しいデータに基づいて再構築されるようになります。 また、コメントアウトされていたMacでのビルドに関する注意書きが削除されています。これは、当時のGoのビルドシステムや依存関係の改善により、この問題が解決されたことを示唆している可能性があります。
  2. lib/time/zoneinfo.zip のバイナリ変更: update.bash スクリプトの実行結果として、zoneinfo.zip ファイルの内容が更新されています。コミットの差分情報には「Binary files a/lib/time/zoneinfo.zip and b/lib/time/zoneinfo.zip differ」と表示されており、ファイルのサイズが 374754 バイトから 352541 バイトに減少していることが示されています。 このサイズ変更は、2014b バージョンのタイムゾーンデータが 2013g バージョンと比較して、データの構造や内容に何らかの変更があったことを意味します。通常、タイムゾーンデータの更新は、新しい規則の追加や既存の規則の修正を伴うため、バイナリファイルのサイズが変わることは一般的です。

このコミットは、Goの time パッケージが提供するタイムゾーン情報の正確性を維持するための定期的なメンテナンス作業の一環です。

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

--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -6,11 +6,9 @@
 # This script rebuilds the time zone files using files
 # downloaded from the ICANN/IANA distribution.
 
-# NOTE: As of Oct, 2013, the C files will not build on Macs but will build on Linux.
-
 # Versions to use.
-CODE=2013g
-DATA=2013g
+CODE=2014b
+DATA=2014b
 
 set -e
 rm -rf work

lib/time/zoneinfo.zip はバイナリファイルであるため、具体的なコードの差分は表示されませんが、その内容が更新されたことが示されています。

コアとなるコードの解説

update.bash スクリプト内の CODEDATA 変数の変更は、Goがタイムゾーンデータを取得する際の「参照バージョン」を直接的に変更します。これにより、スクリプトが実行されるたびに、IANAタイムゾーンデータベースの 2014b バージョンがフェッチされ、Goの内部で使用される zoneinfo.zip がこの最新データに基づいて再生成されます。

zoneinfo.zip のバイナリ更新は、このスクリプトの実行結果であり、Goの time パッケージが実際に使用するタイムゾーンデータが新しいバージョンに置き換えられたことを意味します。これにより、Goアプリケーションは、2014b で導入された最新のタイムゾーン規則(例えば、特定の国の夏時間規則の変更や、新しいタイムゾーンの追加など)を正確に解釈し、適用できるようになります。

この変更は、Goアプリケーションが世界中のユーザーに対して正確な時刻表示と計算を提供するために不可欠です。古いタイムゾーンデータを使用し続けると、特に夏時間の切り替わり時や、タイムゾーン規則が最近変更された地域において、時刻のずれや誤った表示が発生する可能性があります。

関連リンク

参考にした情報源リンク