時間標準とカレンダー:TAI、うるう秒、およびユリウス日
時間は、ソフトウェアエンジニアリングにおいておそらく最も捉えどころがなく、複雑な変数です。表面上は単純に見えますが、私たちが時間を測定する方法は、原子物理学、天体力学、そして歴史的遺産の間の微妙なバランスの上に成り立っています。
このガイドでは、原子レベルの精度を持つ TAI から天文学的な追跡を行うユリウス日、そして実用上の複雑さを持つ IANA タイムゾーンデータベースまで、時間測定の階層を解き明かしていきます。
1. 基礎:TAI(国際原子時)
現代の計時の核となるのが TAI (Temps Atomique International) です。
TAI とは?
TAI は、世界中に分散された 400 以上の原子時計(主にセシウム原子時計)の出力を組み合わせて作られる、高精度な原子時系です。日常生活で使用する時計とは異なり、TAI は進んだり遅れたりすることはありません。それは SI 秒の連続的で単調に増加するカウントです。
なぜ TAI をそのまま使わないのか?
TAI は極めて安定していますが、地球の自転には「固定」されていません。もし TAI だけに頼っていたら、地球の自転は徐々に遅くなっており、わずかに不規則であるため、数千年の間に「正午」がいずれ真夜中へとずれていってしまいます。
2. 天体との架け橋:UTC とうるう秒
時計を太陽と同期させておくために、私たちは UTC (協定世界時) を使用します。
UTC-TAI オフセット
UTC は TAI に基づいていますが、UT1(地球の実際の自転に基づく時系)との差が 0.9 秒以内に保たれています。この同期を維持するために、時折 うるう秒 を挿入(または理論上は削除)します。
これを書いている時点で、UTC = TAI - 37 秒 です。これは、原子時計が私たちの生活用の時計よりも 37 秒「進んでいる」ことを意味します。
うるう秒の議論
うるう秒は分散システムにとって悪夢です。2 台のサーバーがうるう秒を異なる方法で処理した場合(例えば、一方が 1 秒を薄めて処理し、他方が 60 秒目を繰り返した場合)、大規模なレースコンディションやデータ破損につながる可能性があります。これらの技術的な課題のため、2035 年までにうるう秒を段階的に廃止しようとする国際的な取り組みが進んでいます。
3. 天文学者の時間:ユリウス日システム
長期的な歴史計算や天体観測において、標準的なグレゴリオ暦は、月の長さの変化やうるう年があるため、断片的すぎて扱いづらいものです。
ユリウス日 (JD)
ユリウス日は、紀元前 4713 年 1 月 1 日の「ユリウス周期」の開始からの連続した日数のカウントです。歴史上のいかなる日付に対しても、単一で曖昧さのない参照を提供するために設計されました。
- JD 2,460,000.5 は、おおよそ現代に対応します。
- 末尾の「.5」は、ユリウス日が歴史的に午夜ではなく正午 (UT) から始まるためです。これは、天文学者が日付が変わることなく一晩の観測を完了できるようにするためです。
修正ユリウス日 (MJD)
修正ユリウス日は、1957 年にスミソニアン天体物理観測所によって導入されました。定義は以下の通りです。 $$MJD = JD - 2,400,000.5$$ MJD は午夜から始まり、より小さな数字を使用するため、現代のコンピュータストレージや GPS システムにとってより便利です。
4. 実用的な時間:IANA と Olson データベース
ソフトウェア開発者にとって、最大の課題は原子物理学ではなく、人間の政治です。
IANA タイムゾーンデータベース
Olson データベースとしても知られる IANA データベースは、歴史的および現在のすべてのタイムゾーンルールの決定的なコレクションです。単にオフセット(+08:00 など)を保存するだけでなく、特定の地域(America/New_York など)がいつ標準時と夏時間を切り替えるかというルールを保存しています。
なぜ名前が重要なのか
タイムゾーンの識別子は、固定されたオフセットではなく、常に文字列(例:Europe/Paris)として保存する必要があります。もし政府が来年の夏時間の開始日を変更することを決定しても、システムは特定の数字ではなく地域のルールセットにリンクされているため、自動的に適応します。
5. コンピューティングの遺産:POSIX タイム(Unix タイム)
Unix タイム(または POSIX タイム)は、Unix エポック(1970 年 1 月 1 日 00:00:00 UTC)からの経過秒数として定義されています。
うるう秒の「嘘」
Unix タイムにはうるう秒の独特な処理方法があります。それは、うるう秒を無視することです。うるう秒が発生すると、Unix クロックは事実上停止するか、1 秒を繰り返して UTC と同期を保ちます。つまり、Unix タイムは(TAI とは異なり)経過秒数の完璧なカウントではありません。そのため、高頻度取引や科学システムでは内部的に TAI がよく使用されます。
結論
時間は多次元的な構成概念です。次のプロジェクトでは、以下の経験則を覚えておいてください。
- TAI を使用する:2 つのイベント間の正確な期間や間隔を測定する場合。
- UTC (Unix タイム) を使用する:一般的なログ記録やデータ保存の場合。
- IANA 識別子を使用する:ユーザー向けのローカル時間を扱う場合。
- ユリウス日を使用する:天文学や深い歴史分析のためのソフトウェアを構築する場合。
私たちの時計を支配する標準を理解することで、堅牢で予測可能、かつ歴史的に正確なシステムを構築することができます。