プログラムやシステムにおける時間の考え方

IT 時計の画像

どれぐらい正確な時間を必要とするのか

1日に1回とか1年に1回何かを行うシステムを考える。
1秒をカウントすることを86400回繰り返したらその処理を行うというようにすればいいのでは。
1日をカウントする関数をプログラミング言語で用意しとけよと思うかもしれない。
ところが時間というのはそれほど単純なものではないのだ。

おもちゃのシステムとかであれば多少ずれても、
ずれたことを認識してから後で人力で直せば文句ないし、
適当に実装すればよろしい。
そもそもてめえ自身の水晶時計はどんだけ正確なのさと言ってやればいい。

しかし現実に大きな影響を及ぼすシステムの場合は
事故が起こってからでは遅いということはある。
鉄道の運行とか銀行の振り込みとかそういったシステムは多々ある。

そもそも年とか日とか秒って何なのよ

人類は太古から太陽が昇って明るくなってきたら起床して活動を開始し、
太陽が沈んで暗くなってきたら就寝するという生活を行っていた。
これは世界のどこの文明でもそうである。
であればこの太陽が昇って沈むという周期を1として基準にしようという発想ができる。
1日という単位が生まれた瞬間である。

1日が定まっても毎日同じような1日が続くわけではない。
(緯度にもよるが)暑い日が続いて、普通の日、そして寒い日が続くようになり、
普通の日、そして暑い日が続くという周期性がある。
この周期は季節と呼ばれ、特に農作業や食料貯蔵計画に重要である。
であればこの周期を1として基準にしようという発想ができる。
1年という単位が生まれた瞬間である。

じゃあ秒ってなんぞやというと、
日だと流石に単位として大きすぎるだろう。
日常生活ではもう少し区切った単位がほしいとなる。
そこで昼と夜を12ずつに区切るということがなされた。
なぜ12か。それは約数が多いからだろう。12で区切った1つを
さらに(メソポタミアの古代から便利に使われていた)60進数で区切っていった。
10進数ではなく60というのは2、3、5いずれの約数を持っていて分割がしやすい。
角度の単位もこの60の系列が使われていますね。

太陽の南中時刻の間隔は一定でない

太陽の高度が最も高くなる時刻を南中時刻という。
季節によって日の出から日の入りまでの時間は変動すれど、
南中から南中までの間隔は一定のようにみえる。

そもそも南中とはどういう現象だろうか。
地球上のある地点が地球の自転によって太陽に物理的に最も近い位置に来ること。
そのことによってその地点から観測した太陽の高度が1日の中で最も高くなる。
自転というのは北極と南極を結ぶ軸で回転している。
このことから日本のような北半球中緯度帯では真南で太陽高度が最も高くなる。

一方地球は公転もしている。
地球が1回自転する間にわずかに公転軌道を進むので、
その分余分に自転をしないと南中に達しない。
ただし地球の公転軌道は楕円のため公転速度は変化している。
つまり余分に自転しないといけない量が周期変化するのだが、
それはすなわち南中から南中の間隔も周期変化しているということだ。

年と日が綺麗に割り切れない

自転や公転の時間というのは実数に近い性質を持つ連続値だ。
(非常に小さいオーダーでは離散値であるという説もあるが置いといて)
1年と1日の比が綺麗に割り切れるなんてあるはずがないだろう。

しかし神様は幸運にも1年は365日とほぼ1/4日というかなり綺麗な数値を設定してくれた。
人類はほどなく1年を365日の年を3年、366日の年を1年の4年周期にすることを思いつき、
そこからさらに100年に一度は365日のまま、400年に一度は366日という微調整で
ズレをほぼなくせるという結論に至った。
これが現在使われているグレゴリオ暦うるう年のルールである。

科学の進展に伴って天文ではなく身近な物質で秒を定義したい

自転や公転は地質学的スケールでは変化していることは周知の事実だったが、
数年とかの人類的なスケールでも思ってたより揺らぎが大きい(ミリ秒程度)ことがわかった。
そもそも1秒を測定するのに地球が太陽の周りを1回周るまで待つとかやってられない。

その頃原子の振動が固有だというのがわかっていたので、
それを使って秒を定義できないかという発想になる。
これが原子時計による秒の定義である。

時差

「お天道様が真上に昇った時を12時にしよう」「俺も」「俺も」
この願いを世界中の人が叶えつつ同じ時計を使うことはできない。
多分行ったことないけど名前だけは知ってる天文台で有名な
グリニッジ天文台とか明石天文台。
そういった経度が切りの良い地点の時計を国や地域の時計とする。
それが時差の考え方である。なんだけど……

「グリニッジ天文台を0として1時間刻みで±12時間にすれば24個ぐらいで済むやろ。各国空気読んでや」
キリバス「やなこった12時間超え使うもんね」
ネパール「15分刻みにしたろ」
さらに国や地域が政策を変更する、
または国家の統廃合などよって付随する時差も影響を受ける。
現実は勘弁してくれという仕様になっている。

サマータイム

北欧やカナダの夏は早くから明るくなるし結局夜は寒いから
時計の針を1時間進めれば日中の活動が中心となって電気代の節約になるんじゃね?
そんな脳が足りなそうなガバガバ理論を世界的に実施してしまったのがサマータイム。
過去に戻ってサマータイムを思いついた人を暗殺しても
タイムパトロールから追いかけられないのではないかとまで思ってしまう。

サマータイム最大の問題点は1日が23時間とか25時間になる日が存在すること。
(サマータイムが1時間ずらすと仮定したとき)
夜通し動く電車や車の荷物が1時間遅れるまたは早着するとかになる。
遅延なら次の仕事が進められないはもちろんあるし、
早着でも倉庫や道路も無限じゃないぞ。早く着きすぎて溢れる……パンクはあるぞ。

サマータイムが存在しなければ23時間30分かかる定時バッチは1年間問題なく動く。
しかしサマータイムが存在するときバッチが終わってないのに次のバッチの実行時刻が来る。
これが発電所の冷却バッチとかだったら冷却不足で破損とか起こりえますね。

某帝国はさらに2時間ずらすサマータイムを実施しようとする考えを持つ人が現れた?
1時間ずらすでもアレなのに2時間ずらすとか……。
サマータイムを導入するという思想を持つこと自体が
人類のエネルギーの無駄遣いを生む行為に加担する……ふぁっきゅーですね。

うるう秒

天文現象から1秒を切り離して人為的に1秒を策定した人類は
科学実験における秒の単位をかなり正確に測定できるようになった。
しかし86400秒というのが地球の自転1回分+公転分の平均から徐々にズレ始めた。
現実との誤差が1秒を超えないように適宜1秒を挿入したり削除したりする方法が取られた。
これがうるう秒である。(削除のケースはこれまで発生していない)

特定の1分が61秒または59秒になりうるということだ。
そのことを想定している、または2時刻間の差分が正しく取得できますかという話。
想定してない60秒目で記録されたタイムスタンプが悪さをするはありうる。

変な秒数が存在しないように、
丸一日かけて1秒の増分を少しずつ消費していくという流派も台頭している。
しかしこれは現実とは異なる特殊な日となるので軟弱派である。

相対性理論

人工衛星に原子時計乗せたら時間が遅れるんだよ。
相対性理論の効果を入れないとカーナビも正確に実装できないんだよ。」
みたいなことで相対性理論の必要性を論じられたのが、
科学の世界で言うともう太古の昔になってしまった。
元号で言うところの昭和の中程ですか。

令和の時代には日本の光格子時計は10^(-18)の精度を誇り、
1cmの高度差から生じる重力の違いによる時間の遅れを測定できるようになった。
近くに山があったらその質量の分時間が遅れるとか、
山のマグマが上昇してきているかどうかが時計見るだけでわかる世界に入ってきました。
ニュートンの考えた絶対時間のゆらぎが鮮明になってきた現在において時間とは?と考えさせられる。

太陽系の変化

地球の自転エネルギーは月に奪われてだんだん遅くなっていく。
また地球の公転軌道は金星、火星、木星などから摂動を受ける。
さらに太陽は核融合と太陽風放出によって質量を失い、地球の公転軌道を広げる。
1日とか1年が今の1秒の何倍になるかというものは恒久ではないのだ。

火星標準時

火星と地球の自転周期はほぼ一致している。
地球からの指示で動いている間は地球の時計でミッションを遂行するのはいいだろう。
しかし、火星が自立して独立の経済圏を持つようになると
火星標準時を設定せざるを得ない。
それは火星の自転と公転に合わせて設定される。
そのこと自体は特に問題はないのだが、
相対性理論によって時刻の進みが地球と異なることは留意せねばならない。
これは秒ぐらいのスケールを年ぐらいの期間で比較しようとするときに問題になる。
あるしは証券取引所のようなマイクロ秒の精度が求められるものとか。

とはいえ相対論の影響は一定と考えられるし、
地球と火星間でそこまで精密かつ長期間にわたって時刻同期して
何かやるということはなさそうなので、
一般プログラマーは気にしなくてよさそうだ。
というか光速遅すぎて地球の裏側とですら何かやるのは既に辛いよね。

まとめ

いろいろ語ってきたが、結局プログラミング言語側で時間についてきっちり定義するのは難しそうだ。
わりとしっかりしてそうなのは秒の定義ぐらいか?
秒は言語側で対応できるようにして、
それ以上のスケールはプログラムする側が必要な精度に応じてライブラリ使うなり自ら実装するなりする。
それがよさそうだという結論に達した。