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

[インデックス 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 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のビルド時に最終的な配布物の一部として組み込まれていました。

しかし、この方式にはいくつかの課題がありました。

  1. 配布物サイズの増大: 世界中の多数のタイムゾーンに対応するため、これらのバイナリファイルは合計でかなりのサイズになり、Goの配布物全体のフットプリントを増大させていました。
  2. 管理の複雑さ: 個々のファイルを管理することは、更新や整合性の維持において手間がかかる可能性がありました。

この変更の主な目的は、これらの課題を解決し、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のソースツリーから完全に削除されました。この変更の技術的な意味合いは以下の通りです。

  1. ソースツリーの軽量化: 多数のバイナリファイルを削除することで、Goのソースリポジトリ自体のサイズが削減され、クローンや更新がより高速になりました。
  2. 配布メカニズムの変更: 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.ziptime/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/