Tz database

Time Zone Database（元々はtz databaseと呼ばれていた）とは、IANAが管理している、世界各地域の標準時や常用時の等時帯（time zone、タイムゾーン）情報を収録したデータベースである。主にコンピュータ・プログラムやオペレーティングシステムでの利用を意図している。tz、tzdb、tzdata、zoneinfo databaseなどとも呼ばれる。

元々は、アーサー・デイヴィッド・オルソン（Arthur David Olson）が開始したプロジェクトであり、1980年代より複数のボランティアにより更新され続けていた。その事にちなみOlson databaseとも呼ばれる。2011年10月14日よりICANNのIANAが管理することとなった。ポール・エッガート（Paul Eggert）と Tim Parenti が現在のTime Zone Databaseの編集者兼管理者である。

最も目に付く特徴は、ポール・エッガートにより設計されたタイムゾーンの統一的命名規則である。例えば、""や""というような表記法である。データベースは、歴史的な（経年変化を記録した）タイムゾーンならびに1970年のUNIXエポックタイム（1970年1月1日0時0分0秒 UTC）からの、全ての常用時の変更を記録するよう企図されている。また、夏時間のような標準時の変化を示す遷移（transition）情報も含まれ、閏秒でさえも記録されている。

 歴史 

 プロジェクトの起源 
プロジェクトの起源は少なくとも1986年にまで遡る。データベース構築のためタイムゾーンや夏時間の履歴を調査するのに現在も使用している重要な情報源は、（Thomas G. Shanks）により"ACS publications"から1978年以降数版刊行されているアトラス、The American Atlas並びにシャンクスとリック・ポッテンジャー（Rique Pottenger）によるThe International Atlasである。幾つかの参照用ソースコードも含め、プロジェクトのデータベースはパブリックドメインに置かれている。概ね年に数回、変更が必要となる場合にデータベースの新版が公開される。

 訴訟（2011年） 

2011年9月30日、本データベースの著作権侵害を巡ってアストロレーブがオルソンおよびエッガードの2名を提訴した（「アストロレーブ・インコーポレイティッド対オルソン他事件」 Astrolabe, Inc. v. Olson et al.）。その結果、2011年10月6日（UTC）、tz databaseの維持管理並びに頒布の停止がオルソンより発表された。同時にメーリングリストの閉鎖も発表され、最新のアーカイブが配置されていたNIH内のFTPサイトの運営は停止した。オルソンのメールによると、「今回の閉鎖はtz databaseに関連する民事訴訟が同年9月30日に提起され」訴訟係属（"pending legal case"）にある為と述べている。一方に提出された申立訴状（"complaint text"）によると、原告は"ACS Atlas"のデータを自社ソフトウェアに利用する企業、アストロレーブ（"Astrolabe"）であり、「tz databaseがアストロレーブが持つ著作権を侵害した」と主張している。

訴状によると、本件は先に述べた通りtz databaseが参考として使用している2つのアトラス、The American AtlasとThe International Atlasをtz databaseメンテナが著作物として利用したか否かという点が主な争点となる。とりわけ「tzメーリングリスト・アーカイブ」（タイムゾーン・メーリングリスト・アーカイブ。管理についての詳細は、節「管理」を参照）並びに当該データベースと共に維持管理されているいくつかの「補助的な連結収集物」（"auxiliary link collections"）に、アトラスの「データ」が「無断転載」（"unauthorized reproduction"）されたと原告は主張している。しかし、当該データベース自体は実際には申立の対象としてはなっていない。この申立ではタイムゾーン・データの経年変化を記録する「編集物」（"compilation"）のみが関係しており、現行のtz databaseの全世界のタイムゾーンを記録したテーブルは対象となっていない。

tz databaseは、構成ファイルのコメント・テキストを見れば分かる通り、タイムゾーン・データの利用の程度を検証できるよう、当該アトラスを含む情報源を明らかに参照している。このアトラスはtz databaseの構築に都合の良い（好ましい）情報源の一つである。そして当該データベースにアトラスから複製された「事実に基づくデータ」（"factual data"）が多く含まれている。著作権は通常「事実」（"fact"）に付随するものではないが、「創作的表現」（"creative expression"）に対しては発生し得るものであり、当該データベースは当該アトラスの断片を引用したのではなく、主としてタイムゾーン・データを独自の形式（フォーマット）で「複製した」（"reproduce"）のであり、一目見て訴訟申立の根拠は薄弱であると批判されている。加えて、タイムゾーン・データベース全体としても「著作性」（"copyrightable"）はない。その理由は、たとえタイムゾーン・データをアトラスに纏め上げるのに著しい作業量を伴うとしても、アトラスに掲載された情報は完全な事実の収集であり、それ故創作性は無い (これを「額の汗の法理」と呼ぶ) からである、と米国著作権法のあり方から見て通常結論付けられる。

2012年2月22日にアストロレーブはタイムゾーンデータが歴史的事実であることを認め、訴訟を取り下げた。

 IANAの管理前 
tz databaseのコードとデータベース本体は、ボランティア集団により管理されていた。アーサー・デイヴィッド・オルソンはコードへ、ポール・エッガートはデータベースに、それぞれ最も多くの変更を加えた人物である。提案された変更点は、tzメーリングリストに送付される。このメーリングリストは、Usenetニュースグループのcomp.time.tzにゲートウェイを提供している。ソースコードはFTPサーバのelsie.nci.nih.govを経由して頒布される。一般に、これらのファイルはDebianのようなソフトウェア・ディストリビューターに採用され、事前コンパイルを行い、ソースコードとバイナリパッケージがディストリビューションの一部として収録される。エンドユーザーは、いくらか遅延を伴うものの、これらソフトウェア・ディストリビューションのアップデート手続きを頼りにするか、直接 ftp://elsie.nci.nih.gov/pub/ からソースコードを入手して、バイナリファイルを自分でビルドするかどちらかの手段をとることができる。

その当時の管理から、類似の方針を基にIANAによる管理へと移行する計画がIETFにより策定された。これはHTTPベースの通信プロトコルを利用する仕組みを持つとされる。

訴訟提起に基づき（"Pursuant to a lawsuit"）、オリジナルの頒布用FTPサーバとメーリングリストは閉鎖された。2011年10月7日、ICANNの有志（ら）によりメーリングリストのアーカイブが複製され、一時的に仮メーリングリストが開設された。このメーリングリストは引き続きタイムゾーンのメンテナンスの為に利用される。2011年10月14日、IETFから要請を受け、正式にICANNが管理を引き継ぐと発表した。IETF議長ラス・ハウズリー（Russ Housely）は、商用システムを含む様々なソフトウェアでtz databaseが使用されている以上（注: 節"ソフトウェア・システムにおける利用"を参照）、管理が滞ることで起こりえる影響は計り知れない」と述べている。

 IANAへの管理移行 
2011年10月14日、本データベースの管理はICANNのIANAへと引き継がれた。IANAはウェブページにて、著作権侵害の申立を受けているデータも含む完全なデータベースのコピーをオンライン上で公開しており、データベースの管理に関する現行ならびに今後の計画も同時に発表した。BCP 175 () により Time Zone Database の管理の方法が規定されている。タイムゾーン・コンパイラ等のツール（"tzcode"）と生テキストのデータベース本体（"tzdata"）双方がIANA管理下のFTPサーバで頒布されている。

 データ構造 

 ファイルフォーマット 

Time Zone Database はテキストファイルとして公開される。そのファイルは、人が可読な形式であり、ルールとタイムゾーンの遷移情報が一覧化されている。

利用に当たっては、プラットフォーム独立なバイナリファイルにコンパイルされる。バイナリファイルはタイムゾーン毎に1つずつ生成される。参照用ソースコードにはzic（zone information compiler）と呼ばれるコンパイラが付属しており、同時に、関数localtime()や
mktime()といった標準的なAPIを利用してコンパイル済みデータを読み込んだり、利用することができるコードも付属している。これらタイムゾーンの標準的なAPIは標準Cライブラリをはじめとして多くのライブラリに採用されている。とりわけ標準CライブラリはTime Zone Databaseの標準時データをテキスト生データからタイムゾーンコンパイラでコンパイルしてからデータをロードする。GNU Cライブラリ（glibc）とその派生物ではTime Zone Databaseのzicを改変したものを収録している。

Unix系システムでは、オペレーティングシステム・インストール時もしくは、適宜ユーザの指示によりシステム時刻の標準時を指定できる。概ねUTCまたはシステムが設置されている地域の標準時などその他任意の標準時を指定できる。設定の後システムは前述の通りタイムゾーン・テキストをコンパイルする。よってこの場合Time Zone Databaseのアップグレードを行う度にコンパイルし直す必要があるが、概ね現代的なパッケージ管理システムは標準CライブラリもしくはTime Zone Databaseを含むパッケージのアップグレード時に自動的に生テキストデータを再コンパイルする。組み込みLinuxなどのメモリの少ない環境では、コンパイル処理に時間がかかるため、コンパイル済みのパッケージを利用する場合もある。Debian 6.0（コードネーム; squeeze）などではこの方法を採用している。

 タイムゾーンの定義 
Time Zone Database において「タイムゾーン」（"time zone"）とは、1970年以来ずっと地域内の全ての時計が合っているような、国における地域のことである。この定義は、一貫した地方時を持つ地理的地域とまず最初に関係がある。これはグリニッジ子午線からの一貫した差分と関係がある他の定義とは異なる。それゆえ、Time Zone Databaseにより定義された各タイムゾーンは、場合によってはUTCからの時間の差分（協定世界時との差）を複数持つ。典型的には、標準時と夏時間双方が同一のタイムゾーンに含まれる。

 タイムゾーンの命名規則 
タイムゾーンは人間が理解しやすいようにするため、例えば"America/New_York"といったような"地域/地名"形式の固有の名称を持っている。また、その選択は英語名もしくはそれと等価な名前を利用するようになっており、名称の句読点や共通の接尾辞は省かれる。アンダースコアはスペースの代わりに利用される。地名部分におけるハイフンはそのまま用いられる。

 地域 
「地域」（"Area"）とは、大陸名、大洋名、もしくは"Etc"という特殊な名前のいずれかを指す。大陸名と大洋名一式には現在、次が含まれる。アフリカ（Africa）、アメリカ（America）、南極（Antarctica）、北極（Arctic）、アジア（Asia）、大西洋（Atlantic）、オーストラリア（Australia）、ヨーロッパ（Europe）、インド（Indian）、太平洋（Pacific）。

"Etc"という特殊な地域は、幾つかの管理されるタイムゾーン、とりわけUTCを表す"Etc/UTC"のために使用される。POSIX形式、SUSに従うため、"Etc/GMT"を始めとするこれらのタイムゾーン名は、多くの人の予想とは正反対となる符号を持つ（比較のため、UTCのオフセットも参照せよ）。この形式では、タイムゾーン名の符号に関して、GMTから見て西側のタイムゾーンは、正の符号、東側は負の符号を持つ。例えば、Time Zone Databaseのタイムゾーン名"Etc/GMT-14"はGMTから14時間進んでいる、換言すれば、UTCから14時間分東のタイムゾーンに位置する（子午線から東回りに経度210度分進めたタイムゾーンに位置する）。すなわち、UTC+14と同じタイムゾーンを指している。

 地名 
「地名」（"Location"）とは、該当地方内の特定の地名を指し、大抵都市や小規模な島嶼に当たる。このスキームにおいては国名は使用されない。主な理由として、政治的な変更や国境変更は頻繁にあるため国名を利用するスキームではデータの更新作業が煩雑になることが挙げられる。大都市の名前はより永続的な傾向がある。しかしながら、データベースの管理者は、ISO 3166-1 alpha-2(:en:ISO 3166-1 alpha-2)国名コードのそれぞれにおいて、少なくとも1つのタイムゾーンを含むようにしており、そして、データベースへのユーザインタフェースの多くはこのことを利用している。加えて、将来タイムゾーンが変更された際に地域が異なるタイムゾーンに分断されないように地名の選択は地理的にコンパクトになるよう望まれている。

通常、地名には、全体のタイムゾーンを代表するある地方の人口の最も大きい都市が選択される。しかしながら、幅広く知られている名前やより曖昧ではない名前を持つその他の都市が存在する場合、そちらが選択される可能性がある。都市名が変更されたという場合においては、旧名と新規の名称双方が同じデータベース・エントリを指し示すようにするため、将来のバージョンにおいて「別名」（"alias", エイリアス）を作成するという慣習がある。

時には「地名」がそれ自身、複合的な名称で表現される場合がある。""というタイムゾーンがそのような例である。このような3段階形式の名称は現在、"America/Argentina/..."、"America/Kentucky/..."、"America/Indiana/..."、そして"America/North_Dakota/..."以下のゾーンにのみ存在する。

選択された地名は完全なその地域の代表となる。そのため、すべての都市名がその名にちなんで命名されるタイムゾーンを持つとは限らない。例えば、"America/Boston"というタイムゾーンは存在しない。更に、現時点で所属するタイムゾーンが同一であるが互いに異なる都市は、歴史的な意味で別名が付けられている場合（例えば、同じ標準時である"America/Detroit"と"America/New_York"の違い）や、または同じタイムゾーンに属するが異なる別々の都市が歴史的な意味で異なる国に分断された場合（例えば、旧チェコスロバキアの分裂による"Europe/Prague"と"Europe/Bratislava"の違い）により、たとえ現時点ではタイムゾーンが一致しているにもかかわらず、将来異なるタイムゾーン名を持つ可能性もある。

2010年5月1日、アーサー・デイヴィッド・オルソンは地名の文字数の限度を14に定めることを述べている。その理由は例えば（Bahía de Banderas）のような地名から"de"を削り、識別子を"Bahia_Banderas"（データベース上では）のみに限定することを正当化するためである。

 表記例 
 国名（コスタリカ）が使用されている。同国最大都市はサンホセであるが、英字名"San José"は様々な都市名（例: サンノゼ）で使われており不適当であるため。 スペースはアンダースコアに置換されている。 島名（サハリン）が使用されている。同島最大都市ユジノサハリンスクは英字名で"Yuzhno-Sakhalinsk"となり、Time Zone Databaseの制限である14文字以内の地名表記を超えてしまうため。 最大都市名であるが、正式名称「」（"Bahía de Banderas"）から"de"が欠落している。これは正しい英字名称では14文字を超えてしまうため。 文字"'"（アポストロフィー）は除去されている。アンダースコアと置換せずスペースを除去するのは規則通りではないが、アンダースコアを付けると全部で15文字になってしまうため例外的にこのような名称になっている。

 各タイムゾーンのデータ格納 
大抵は標準時と夏時間の遷移のことを指すが、UTCからの複数の時間差分を持つ各タイムゾーン向けに、Time Zone Database は時刻の遷移を正確に記録している。このフォーマットは、遷移の日時の変化も適宜調節できる。

 zone1970.tab 
zone1970.tab はライセンスがパブリックドメインの Time Zone Database のファイルの1つである。かつては zone.tab が使われていたが、現在は zone1970.tab の方を使うことが推奨されており過去との互換性のために zone.tab が残されている。zone1970.tab にはタイムゾーンが一覧で記述されている。2014年7月19日までの zone.tab には、列、行が表す区分はファイル内のコメントに次のように記述されていた。
 # This file contains a table with the following columns:
 # 1. ISO 3166 2-character country code. See the file `iso3166.tab'.
 # 2. Latitude and longitude of the zone's principal location
 # in ISO 6709 sign-degrees-minutes-seconds format,
 # either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
 # first latitude (+ is north), then longitude (+ is east).
 # 3. Zone name used in value of TZ environment variable.
 # 4. Comments; present if and only if the country has multiple rows.
 #
 # Columns are separated by a single tab.
 # The table is sorted first by country, then an order within the country that
 # makes some geographical sense, and
 # puts the most populous zones first, where that does not contradict .
参考訳:
 # 当ファイルは次の各列要素から成る表（テーブル）で構成される:
 # 1. ISO 3166 2-文字による国名コード。詳しくはファイル`iso3166.tab'を見よ。
 # 2. タイムゾーンの主要都市の緯度、経度をISO 6709の
 # 符号（+または-）-度（D）-分（M）-秒（S）フォーマットで表記。
 # フォーマットは+-DDMM+-DDDMMまたは+-DDMMSS+-DDDMMSSのいずれかを選択。
 # 始めに北回りを正の符号にとる緯度、続いて東回りを正の符号にとる経度を記載。
 # 3. 環境変数TZの値に含まれるタイムゾーン名を記述。
 # 4. コメント; 該当する国の記述が複数の行に渡る場合に限り記載。
 #
 # 各列要素は単一のタブで区切られる。
 # 表の各行のデータは国名によってまず区分けられ、続いて、次の順序に従い各国のデータを並べ替える。
 # 幾つかの地理的な意義による、かつ
 # 最大の人口を持つゾーンを先頭に配置する。ただしと矛盾しないようにすること。

 区域 

 1970年以後での複数国に及ぶタイムゾーン 
1970年以後において、2つの国に及ぶ地域を含むタイムゾーンが2つ存在する。tzdataはISO 3166-1の規格通りの国ならびに国名コードの定義に従っている（ISO 3166-1はその先行規格、ISO 3166を1974年に初めて公開している）。
 - 1990年まではこのタイムゾーンは2つの国、、イエメン・アラブ共和国（首都サナア、ISO 3166-1: YE）と南イエメン（首都アデン、ISO 3166-1: YD, ISO 3166-3: YDYE）に分かれていた。
 - 1990年まではこのタイムゾーンは西ドイツ（ISO 3166-1: DE）と東ドイツ（ISO 3166-1: DD, ISO 3166-3: DDDE）に分かれていた。

 1970年以前のデータ 
1970年より以前のデータに関しては、地域のタイムゾーンを同定する都市名を修正するよう注意を払っている。しかし、必ずしも地域全体でそのような修正が必要とは限らない。なぜなら1970年時点からの標準時を区別する場合にのみ、新しい地域が作成されるからである。

例えば、1963年10月23日から1963年12月9日までブラジル、ミナスジェライス州、エスピリトサント州、リオデジャネイロ州、サンパウロ州は夏時間制度を採用していた。しかし、1970年からの標準時はこの地域全体では同一であったため、タイムゾーンを分割する要求は却下された。

ドイツ時間の例では、トライゾーン内でベルリンと異なる夏時間を採用していた1945年に関しては、タイムゾーンは正しい時刻を示していないとされる。

 誤情報 
かつて誤ったタイムゾーンが含まれていたケースがあった。とりわけ日本標準時における誤りについては、記事"日本標準時#South Ryukyu Islands時間"等を参照されたい。これは前述したThe International Atlasの第3版に誤った記述が含まれていたため起こった。

 利用法と拡張 

 タイムゾーンの境界 
経緯度に基づく地理的な「境界線」（国境線ではない）の情報はTime Zone Databaseの一部ではない。しかしながら、境界線に関する情報は存在し、エリック・ミュラー（Eric Muller）が、Time Zone Databaseに収録されている「タイムゾーンに関する『境界線』」をベクター図形のイメージに表現したものを一般に公開している（上図）。このベクター図形を利用すると、地球上の経緯度上の各地点に位置づけられる、Time Zone Database上のタイムゾーンを決定できる。

 その他の標準の利用 
CLDRはUN/LOCODEを地域同定に利用している。この実装は全ての識別子が国家を参照しており、Time Zone Databaseの開発元が避けたいと思っている事項も含まれている。

 ソフトウェアシステムにおける利用 
Time Zone Database は多くのコンピュータシステム上でタイムゾーン処理とタイムゾーン変換のために利用されている。以下のような例が挙げられる。

 オペレーティングシステム
 Microsoft Windows 以外のほとんどのOSで使われている。マイクロソフトは独自に時間帯の情報収集を行っている。航空業界も独自のIATAタイムゾーンがある。
Unix系
BSDの派生システム、とりわけBSDの子孫と呼ばれる、FreeBSD、NetBSD、OpenBSD、DragonFly BSD。またmacOSも含まれる。これらのOSはTime Zone Databaseが処理するコードをOS固有の「TZ POSIX API実装」として参照している。
 GNU Cライブラリとそれを利用するシステム。例えばGNUオペレーティングシステム (GNU Hurd) と大部分のLinuxディストリビューション、その他BeOS、Haiku、Nexenta OS、Cygwin。
 System V Release 4の派生システム、例えばSolarisとUnixWare。
 IBM AIX 6.1以降（初期のAIXのバージョン、とりわけAIX 5.2時点ではzoneinfoは含まれていた。これはMySQLのようなサードパーティーアプリケーションのサポートのためである。しかし実際にはそれは利用不可能だった）。
 Tru64
 UNICOS/mp
 IRIX
 OpenVMS
 プログラミング言語
 Java Runtime Environment。2002年の1.4リリースより利用している。
 Perlモジュールである、DateTime::TimeZone、DateTime::LeapSecondが2003年より利用している。
 PHPは2005年の5.1.0リリースより採用している。
 Pythonは dateutil や pytz などのパッケージ。
 .NET Frameworkは、Windows 以外では IANA の Time Zone Database が使われている。Windows では TimeZoneConverter や zoneinfoなどのライブラリ。
 Embarcadero Delphi用モジュールのdelphi-tzdb。
 その他ソフトウェア
 Oracle Database。2004年の10gリリースから採用している。
 PostgreSQL。2005年のリリース8.0から採用している。
 ファームウェア内で利用するIP clocks、その他組み込みソフトウェア。

その他、Olson timezone IDというものがユニコードコンソーシアムのCLDR並びにICUで利用されている。例えば、「CLDR Windows → Tzid」テーブルは、Microsoft Windows time zone IDsから標準的Olson名へのマッピングを行う。

 実例 

 Unix系システム 
Linuxディストリビューションをはじめとする多くのUnix系システムにおいて、タイムゾーンデータが格納されている標準的なディレクトリパスは/usr/share/zoneinfo/である。ファイルの形式識別用コマンドであるは、次の実行例のように、バイナリ形式のタイムゾーンファイル内部からデータを読み出し、人間が理解しやすいテキスト形式で表示する機能をサポートしている。

Unix系システムにおいて、環境変数TZにTime Zone Databaseのタイムゾーンを指定しdateコマンドの出力結果が変化する様子を示す。シェルのロケールは日本（例: 環境変数LANG=ja_JP.UTF-8など）に指定されているものとする。またOSのインストール時に指定したタイムゾーンは日本標準時であるものとする。タイムゾーン設定はGNU Cライブラリでは/etc/localtimeファイルに保存され、コンパイル済みタイムゾーンデータは/usr/share/zoneinfoディレクトリ以下に保存されることが多いとされる。

dateコマンドは引数に何も指定しないで実行した場合、デフォルトではシステム時刻と/etc/localtimeのシステム・タイムゾーン設定を検知し両者を表示する。

日本標準時を明示的に指定する場合は以下となる。

フランスは中央ヨーロッパ時間（CET）を採用している。TZに指定した場合の結果は以下となる。

フランスでは4月は夏時間施行期間であるため、3ヶ月後は、

POSIX形式では、グリニッジ子午線の西回りを正の符号で表記する。符号に注意せよ。

TZに無効な文字列を指定した場合、すべて協定世界時（UTC）であると見なされる。

よくある間違いはTZにJSTと指定してしまうことである。これだとTZにUTCを指定した場合と同じになってしまう。POSIXのTZ環境変数の表記に合わせるならば、JST-9と指定しなければならない（符号の正負に注意せよ）。tz databaseの作者はtz databaseが利用できる環境ならば、このようなPOSIX表記を利用せずとも、最初に挙げたのような表記を利用した方が誤りを軽減できると述べている。