[インデックス 12054] ファイルの概要
このコミットは、Go言語の標準ライブラリ lib/time/zoneinfo
ディレクトリに存在していたタイムゾーン情報ファイルを削除するものです。具体的には、世界各地のタイムゾーン定義を含むバイナリファイル群が削除されています。
コミット
- コミットハッシュ:
f7410873ba731e4896c27f9ee866c18cb15668bf
- 作者: Russ Cox rsc@golang.org
- コミット日時: 2012年2月19日(日) 03:19:05 -0500
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f7410873ba731e4896c27f9ee866c18cb15668bf
元コミット内容
lib/time/zoneinfo: delete
Now in zoneinfo.zip.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5671098
変更の背景
このコミットの背景には、Go言語がタイムゾーン情報をどのように管理・提供するかという設計上の変更があります。以前のGoのバージョンでは、lib/time/zoneinfo
ディレクトリ内に個別のタイムゾーン定義ファイル(IANA Time Zone Databaseのコンパイル済みデータ)が直接含まれていました。しかし、これらのファイルは数多く存在し、Goのソースツリーのサイズを増大させる要因となっていました。
この変更の主な目的は、Goの配布物からこれらの個別のタイムゾーンファイルを削除し、代わりに単一の圧縮ファイル zoneinfo.zip
として提供することです。これにより、Goの配布物のサイズを削減し、タイムゾーンデータの管理を簡素化することが可能になります。Goの time
パッケージは、この zoneinfo.zip
からタイムゾーン情報を読み込むように変更されました。
前提知識の解説
タイムゾーン (Time Zone)
タイムゾーンとは、地球上の特定の地域で共通して使用される標準時の領域を指します。夏時間(Daylight Saving Time, DST)の導入や廃止、オフセットの変更など、歴史的に多くの変更が行われてきました。
IANA Time Zone Database (tz database)
IANA Time Zone Database(旧称 tz database または zoneinfo database)は、世界のすべてのタイムゾーンと、それらのタイムゾーンにおける歴史的な時間変更(夏時間の開始・終了、標準時の変更など)に関する情報を集約した公開データベースです。このデータベースは、zoneinfo
形式と呼ばれるバイナリ形式でコンパイルされ、多くのUnix系システムで /usr/share/zoneinfo
などに配置されています。
zoneinfo
ファイル
zoneinfo
ファイルは、IANA Time Zone Databaseのテキストデータをバイナリ形式にコンパイルしたものです。各ファイルは特定のタイムゾーン(例: America/New_York
, Asia/Tokyo
)のルールを含んでおり、タイムゾーンのオフセット、夏時間の適用期間、略称などの情報が格納されています。
Go言語の time
パッケージ
Go言語の標準ライブラリ time
パッケージは、時刻の表現、時間間隔の計算、タイムゾーンの処理など、時間に関する機能を提供します。time.LoadLocation
関数などを使用して、特定のタイムゾーンの *time.Location
オブジェクトをロードし、そのタイムゾーンでの時刻を扱うことができます。
zoneinfo.zip
Go 1.0以降、Goの time
パッケージは、システムにインストールされている zoneinfo
ファイル(通常は /usr/share/zoneinfo
)を読み込むか、またはGoの配布物に含まれる zoneinfo.zip
ファイルからタイムゾーン情報を読み込むように設計されています。この zoneinfo.zip
は、IANA Time Zone Databaseのコンパイル済みデータを単一のZIPアーカイブにまとめたものです。これにより、Goアプリケーションが実行される環境に zoneinfo
ファイルが存在しない場合でも、Go自身がタイムゾーン情報を利用できるようになります。
技術的詳細
このコミットは、Goのビルドプロセスと配布物の構造に影響を与えます。以前は、Goのソースツリー内に個別の zoneinfo
バイナリファイルが多数存在し、これらがGoのビルド時に最終的な配布物に含まれていました。この変更により、これらの個別のファイルはソースツリーから削除され、代わりにビルドプロセスの一部として zoneinfo.zip
が生成されるか、またはGoの配布物に事前にコンパイルされた zoneinfo.zip
が含まれるようになりました。
Goの time
パッケージは、タイムゾーン情報をロードする際に、まずシステムパス(ZONEINFO
環境変数、/usr/local/go/lib/time/zoneinfo.zip
、/usr/share/zoneinfo
、/etc/zoneinfo
など)を探索し、適切な zoneinfo
データを見つけます。このコミットは、Goのソースツリーから直接 lib/time/zoneinfo
ディレクトリを削除することで、Goの配布物自体が個別のタイムゾーンファイルを直接持つ必要がなくなったことを示しています。これにより、Goの配布物のフットプリントが小さくなり、管理が容易になります。
コアとなるコードの変更箇所
このコミットでは、lib/time/zoneinfo
ディレクトリ以下の全てのファイルが削除されています。具体的には、以下の形式で多数のファイルが削除されています。
lib/time/zoneinfo/Africa/Abidjan
lib/time/zoneinfo/America/New_York
lib/time/zoneinfo/Asia/Tokyo
lib/time/zoneinfo/Europe/London
- ...など、世界中の約580以上のタイムゾーン定義ファイル。
Gitの差分情報では、これらのファイルが Bin <サイズ> -> 0 bytes
と表示されており、バイナリファイルが完全に削除されたことを示しています。
コアとなるコードの解説
このコミット自体は、Go言語のコードベースから特定のファイルを削除する操作のみを行っています。Goの time
パッケージ内部のロジックが、これらの個別のファイルではなく zoneinfo.zip
を参照するように変更されたため、これらのファイルはもはや必要なくなりました。
この変更は、Goの time
パッケージがタイムゾーンデータをどのように取得するかという内部実装の詳細に関わるものであり、Go言語を使用する開発者が time
パッケージを扱う際のAPIには直接的な影響はありません。開発者は引き続き time.LoadLocation
などの関数を使用してタイムゾーンをロードできますが、その背後でGoがタイムゾーンデータを取得するメカニズムがより効率的になったことを意味します。
関連リンク
- Go Time Package Documentation: https://pkg.go.dev/time
- IANA Time Zone Database: https://www.iana.org/time-zones
- Go Change List 5671098: https://golang.org/cl/5671098 (元コミットメッセージに記載されているGoのコードレビューシステムへのリンク)
参考にした情報源リンク
- Go Time Package Source Code (time/zoneinfo.go): Goの
time
パッケージのソースコード(特にzoneinfo.go
)は、zoneinfo.zip
からタイムゾーン情報を読み込むロジックを理解する上で重要です。 - Go Issue Tracker (関連するIssueやProposal): Goのタイムゾーンデータ管理に関する議論や決定は、GoのIssueトラッカーで確認できます。
- Go Blog (関連する記事): Goの重要な変更点については、公式ブログで解説されることがあります。
[インデックス 12054] ファイルの概要
このコミットは、Go言語の標準ライブラリ lib/time/zoneinfo
ディレクトリに存在していた、世界各地のタイムゾーン定義を含むバイナリファイル群を削除するものです。これは、Goがタイムゾーン情報を管理する方法を、個別のファイルから単一の圧縮された zoneinfo.zip
ファイルに移行したことによる変更です。
コミット
- コミットハッシュ:
f7410873ba731e4896c27f9ee866c18cb15668bf
- 作者: Russ Cox rsc@golang.org
- コミット日時: 2012年2月19日(日) 03:19:05 -0500
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f7410873ba731e4896c27f9ee866c18cb15668bf
元コミット内容
lib/time/zoneinfo: delete
Now in zoneinfo.zip.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5671098
変更の背景
このコミットは、Go言語がタイムゾーン情報をどのように管理し、配布するかという設計思想の重要な転換を示しています。以前のGoのバージョンでは、IANA Time Zone Databaseからコンパイルされた個別のタイムゾーン定義ファイル(例: Africa/Abidjan
, America/New_York
, Asia/Tokyo
など)が、Goのソースツリー内の lib/time/zoneinfo
ディレクトリに直接含まれていました。これらのファイルは、Goのビルド時に最終的な配布物の一部として組み込まれていました。
しかし、この方式にはいくつかの課題がありました。
- 配布物サイズの増大: 世界中の多数のタイムゾーンに対応するため、これらのバイナリファイルは合計でかなりのサイズになり、Goの配布物全体のフットプリントを増大させていました。
- 管理の複雑さ: 個々のファイルを管理することは、更新や整合性の維持において手間がかかる可能性がありました。
この変更の主な目的は、これらの課題を解決し、Goの配布物のサイズを削減し、タイムゾーンデータの管理を簡素化することです。具体的には、個別のタイムゾーンファイルをソースツリーから削除し、代わりにすべてのタイムゾーンデータを単一の圧縮ファイル zoneinfo.zip
として提供する方式に移行しました。これにより、Goの time
パッケージは、この zoneinfo.zip
からタイムゾーン情報を効率的に読み込むように変更されました。
前提知識の解説
タイムゾーン (Time Zone)
タイムゾーンとは、地球上の特定の地域で共通して使用される標準時の領域を指します。これは、経度に基づいて設定されることが一般的ですが、政治的・地理的な理由により、必ずしも経度線に厳密に従うわけではありません。また、多くの地域では夏時間(Daylight Saving Time, DST)が導入されており、特定の期間に時計を1時間進めることで、日照時間を有効活用します。この夏時間の開始・終了日や、標準時からのオフセットは、国や地域によって異なり、歴史的に頻繁に変更されてきました。
IANA Time Zone Database (tz database)
IANA Time Zone Database(旧称 tz database または zoneinfo database)は、世界のすべてのタイムゾーンと、それらのタイムゾーンにおける歴史的な時間変更(夏時間の開始・終了、標準時の変更、過去のタイムゾーンルールの変更など)に関する情報を集約した、世界的に利用されている公開データベースです。このデータベースは、タイムゾーンの専門家によって維持されており、その正確性と網羅性から、多くのオペレーティングシステムやプログラミング言語で標準的なタイムゾーン情報源として採用されています。
zoneinfo
ファイル
zoneinfo
ファイルは、IANA Time Zone Databaseのテキスト形式のルールデータ(tzdata
)を、特定のバイナリ形式にコンパイルしたものです。各 zoneinfo
ファイルは、特定のタイムゾーン(例: America/New_York
, Asia/Tokyo
)のルールを含んでおり、そのタイムゾーンの標準時オフセット、夏時間の適用期間、過去の変更履歴、タイムゾーンの略称などの情報が効率的に格納されています。Unix系システムでは、通常 /usr/share/zoneinfo
ディレクトリ以下にこれらのファイルが配置されており、システム上のアプリケーションがタイムゾーン情報を参照する際に利用されます。
Go言語の time
パッケージ
Go言語の標準ライブラリ time
パッケージは、日付、時刻、期間、タイムゾーンといった時間に関する概念を扱うための包括的な機能を提供します。このパッケージは、time.Time
型を用いて特定の時点を表現し、time.Duration
型で時間間隔を扱います。特にタイムゾーンに関しては、time.Location
型が特定のタイムゾーンを表し、time.LoadLocation
関数を使ってタイムゾーン名を指定して time.Location
オブジェクトをロードすることができます。これにより、異なるタイムゾーン間での時刻の変換や、特定のタイムゾーンにおける時刻の表示が可能になります。
zoneinfo.zip
zoneinfo.zip
は、IANA Time Zone Databaseのコンパイル済み zoneinfo
データを単一のZIPアーカイブにまとめたものです。Go言語の time
パッケージは、この zoneinfo.zip
ファイルからタイムゾーン情報を読み込む機能をサポートしています。このメカニズムは、Goアプリケーションが実行されるシステムに標準の zoneinfo
ファイルがインストールされていない場合や、クロスプラットフォームでの一貫したタイムゾーン動作を保証したい場合に特に有用です。Go 1.15以降では、time/tzdata
パッケージをインポートするか、ビルドタグ -tags timetzdata
を使用することで、この zoneinfo.zip
の内容をGoのバイナリに直接埋め込むことが可能になり、アプリケーションのポータビリティと信頼性がさらに向上しました。
技術的詳細
このコミットは、Goのビルドシステムとランタイムにおけるタイムゾーンデータの取り扱い方に大きな変更をもたらしました。
以前は、Goのソースリポジトリには、世界中の各タイムゾーンに対応する個別のバイナリ zoneinfo
ファイルが lib/time/zoneinfo/
ディレクトリ以下に直接格納されていました。これらのファイルは、Goのコンパイル時にGoの標準ライブラリの一部として組み込まれ、最終的なGoの配布物に含まれていました。
このコミットにより、これらの個別の zoneinfo
ファイルはGoのソースツリーから完全に削除されました。この変更の技術的な意味合いは以下の通りです。
- ソースツリーの軽量化: 多数のバイナリファイルを削除することで、Goのソースリポジトリ自体のサイズが削減され、クローンや更新がより高速になりました。
- 配布メカニズムの変更: Goの
time
パッケージは、タイムゾーン情報をロードする際に、もはやこれらの個別のファイルに依存しなくなりました。代わりに、Goは以下の優先順位でタイムゾーンデータを探索します。ZONEINFO
環境変数で指定されたパス。- Unix系システムにおける標準的なインストール場所(例:
/usr/share/zoneinfo
,/etc/zoneinfo
)。 - Goのインストールディレクトリ内の
$GOROOT/lib/time/zoneinfo.zip
。 - Go 1.15以降で導入された
time/tzdata
パッケージがインポートされている場合、そのパッケージに埋め込まれたタイムゾーンデータ。
この変更により、Goの配布物自体が個別のタイムゾーンファイルを直接持つ必要がなくなり、より柔軟なタイムゾーンデータ管理が可能になりました。開発者は、システムに依存するか、Goが提供する zoneinfo.zip
を利用するか、あるいは time/tzdata
パッケージを使ってバイナリに埋め込むかを選択できるようになりました。これにより、異なる環境間でのタイムゾーン動作の一貫性を確保しやすくなっています。
コアとなるコードの変更箇所
このコミットのコアとなる変更は、lib/time/zoneinfo
ディレクトリ以下の全てのファイルの削除です。
具体的には、以下のパターンに合致する約581個のバイナリファイルが削除されました。
lib/time/zoneinfo/Africa/*
lib/time/zoneinfo/America/*
lib/time/zoneinfo/Antarctica/*
lib/time/zoneinfo/Arctic/*
lib/time/zoneinfo/Asia/*
lib/time/zoneinfo/Atlantic/*
lib/time/zoneinfo/Australia/*
lib/time/zoneinfo/Brazil/*
lib/time/zoneinfo/CET
lib/time/zoneinfo/CST6CDT
lib/time/zoneinfo/Canada/*
lib/time/zoneinfo/Chile/*
lib/time/zoneinfo/Cuba
lib/time/zoneinfo/EET
lib/time/zoneinfo/EST
lib/time/zoneinfo/EST5EDT
lib/time/zoneinfo/Egypt
lib/time/zoneinfo/Eire
lib/time/zoneinfo/Etc/*
lib/time/zoneinfo/Europe/*
lib/time/zoneinfo/Factory
lib/time/zoneinfo/GB
lib/time/zoneinfo/GB-Eire
lib/time/zoneinfo/GMT*
lib/time/zoneinfo/Greenwich
lib/time/zoneinfo/HST
lib/time/zoneinfo/Hongkong
lib/time/zoneinfo/Iceland
lib/time/zoneinfo/Indian/*
lib/time/zoneinfo/Iran
lib/time/zoneinfo/Israel
lib/time/zoneinfo/Jamaica
lib/time/zoneinfo/Japan
lib/time/zoneinfo/Kwajalein
lib/time/zoneinfo/Libya
lib/time/zoneinfo/MET
lib/time/zoneinfo/MST
lib/time/zoneinfo/MST7MDT
lib/time/zoneinfo/Mexico/*
lib/time/zoneinfo/Mideast/*
lib/time/zoneinfo/NZ*
lib/time/zoneinfo/Navajo
lib/time/zoneinfo/PRC
lib/time/zoneinfo/PST8PDT
lib/time/zoneinfo/Pacific/*
lib/time/zoneinfo/Poland
lib/time/zoneinfo/Portugal
lib/time/zoneinfo/ROC
lib/time/zoneinfo/ROK
lib/time/zoneinfo/Singapore
lib/time/zoneinfo/Turkey
lib/time/zoneinfo/UCT
lib/time/zoneinfo/US/*
lib/time/zoneinfo/UTC
lib/time/zoneinfo/Universal
lib/time/zoneinfo/W-SU
lib/time/zoneinfo/WET
lib/time/zoneinfo/Zulu
Gitの差分では、これらのファイルが Bin <元のサイズ> -> 0 bytes
と表示されており、ファイルの内容が完全に削除されたことを示しています。
コアとなるコードの解説
このコミット自体は、Go言語のソースコードに新たな機能を追加したり、既存のロジックを変更したりするものではありません。その代わりに、Goの標準ライブラリの一部としてこれまで含まれていた、タイムゾーン情報を含むバイナリファイルを一括して削除するという、ファイルシステムレベルの変更を行っています。
このファイル削除は、Goの time
パッケージがタイムゾーンデータを取得するメカニズムが変更された結果として行われました。つまり、Goの内部実装が、個別の zoneinfo
ファイルを直接参照するのではなく、zoneinfo.zip
という単一の圧縮アーカイブからデータを読み込むように進化しました。そのため、Goのソースツリー内にこれらの個別のバイナリファイルを保持する必要がなくなったのです。
この変更は、Go言語を使用する開発者が time
パッケージを扱う際の公開API(例: time.LoadLocation
)には直接的な影響を与えません。開発者はこれまで通り、タイムゾーン名を指定して time.Location
オブジェクトをロードできます。しかし、その背後でGoがタイムゾーンデータをどのように探し、ロードするかの内部的な詳細が、より効率的で管理しやすい方法に移行したことを意味します。これにより、Goの配布物のサイズが削減され、タイムゾーンデータの更新や配布が簡素化されるというメリットがもたらされました。
関連リンク
- Go Time Package Documentation: Go言語の
time
パッケージに関する公式ドキュメント。タイムゾーンの扱い方や関連する関数について詳細に解説されています。 https://pkg.go.dev/time - IANA Time Zone Database: 世界のタイムゾーン情報を提供する公式データベース。タイムゾーンのルールや歴史的な変更に関する情報源です。 https://www.iana.org/time-zones
- Go Change List 5671098: このコミットに対応するGoのコードレビューシステム(Gerrit)上の変更リスト。元のコミットメッセージに記載されています。 https://golang.org/cl/5671098
参考にした情報源リンク
- Go Time Package Source Code (time/zoneinfo.go): Goの
time
パッケージのソースコード、特にzoneinfo.go
ファイルは、zoneinfo.zip
からタイムゾーン情報を読み込む内部ロジックを理解する上で非常に参考になります。 - Go Blog - Go 1.15 and the
time/tzdata
package: Go 1.15で導入されたtime/tzdata
パッケージに関する公式ブログ記事。タイムゾーンデータの埋め込みとポータビリティについて解説されています。 https://go.dev/blog/go1.15-time-tzdata - Go Issue Tracker (関連するIssueやProposal): Goのタイムゾーンデータ管理に関する過去の議論や設計決定は、GoのIssueトラッカーやデザインドキュメントで確認できます。
- reintech.io - Go Time Package and Timezone Handling: Goの
time
パッケージとタイムゾーン処理に関する解説記事。zoneinfo.zip
やtime/tzdata
の役割について触れられています。 https://reintech.io/blog/go-time-package-and-timezone-handling - zerokspot.com - Go and Timezones: Goにおけるタイムゾーンの扱いに関するブログ記事。システムタイムゾーンデータと
zoneinfo.zip
の関係について説明されています。 https://www.zerokspot.com/blog/2020/08/17/go-and-timezones/ - wawand.co - Go Timezone Data: Goのタイムゾーンデータに関する解説。
time/tzdata
パッケージの利用方法についても言及されています。 https://wawand.co/go-timezone-data/