UNIX時間がうるう秒をどう扱うか

UNIX時間がうるう秒をどう扱うか

公開日: 2026-06-18

UNIX時間(UNIXタイムスタンプ)は「1970-01-01T00:00:00Z からの経過秒数」と説明されることが多いですが、これは厳密には正しくありません。 実際には地球の自転速度のずれを補正する「うるう秒」が無視されており、この仕組みを理解していないと、ログの時刻計算やシステム間の時刻同期で思わぬズレに遭遇することがあります。

うるう秒とは何か

地球の自転速度はわずかに不規則で、原子時計が示す正確な1秒の積み重ね(UTC: 協定世界時の基礎となるTAI)と、地球の自転に基づく時刻との間に少しずつズレが生じます。 このズレが0.9秒以内に収まるよう、国際機関の判断で1秒を挿入(まれに削除)するのが「うるう秒」です。 1972年の導入以来、2025年時点で27回挿入されており、挿入は6月30日または12月31日の最後に「23:59:60」という、通常存在しない時刻を一時的に作る形で行われます。

POSIX定義: 1日は常に86400秒

UNIX時間はPOSIX規格で「うるう秒を無視し、1日を常に86400秒として数える」と定義されています。 つまりうるう秒が挿入された日であっても、UNIX時間のカウンタは86400秒分しか進みません。 実際のUTCではその日に86401秒が存在するにもかかわらず、UNIX時間上ではその1秒が「存在しなかったこと」になる、というのがこの仕組みの本質です。 結果として、うるう秒が挿入された瞬間、UNIX時間とUTCの対応関係は一瞬だけ巻き戻る(同じUNIX時間の値が2回現れる)という特殊な状態になります。

実務で問題になる場面

  • うるう秒を跨ぐ期間の「経過秒数」を単純にUNIX時間の差で計算すると、実際の経過時間より1秒短く算出されます。 ミリ秒単位の精度が要求される金融システムや分散システムの順序保証では、この1秒のズレが問題になることがあります。
  • GoogleやAmazonなどの大規模事業者は、うるう秒の瞬間に時刻を一気に進めるのではなく、前後数時間〜1日かけてサーバーの時刻を少しずつ遅く(または速く)進める「leap smear」という手法でこの問題を回避しています。 自前でNTP同期を行うシステムでも、この前提を理解しておくと予期しない時刻のジャンプに気づきやすくなります。
  • 2022年の国際会議で、うるう秒の運用を2035年までに廃止する方針が決議されています。 廃止後はUTCとUT1(天文時)のズレがある程度蓄積してから1分単位などでまとめて補正する案が検討されており、UNIX時間の86400秒固定という前提自体は今後も変わらない見込みです。

変換時の注意点

通常の日時⇔UNIX時間の相互変換(カレンダー上の年月日時分秒とタイムスタンプの変換)では、うるう秒を意識する必要はほとんどありません。 多くのライブラリやOSはうるう秒を無視したPOSIX定義に従っているため、変換結果は一般的な用途では問題なく一致します。 注意が必要なのは「2つの時刻の差から正確な経過時間(実時間)を求める」場合で、対象期間にうるう秒が含まれていると、UNIX時間の単純な差分は実際の経過時間と最大で挿入されたうるう秒の回数分だけズレることを覚えておくと安心です。