エポック時間を解説:Unix タイムスタンプ ゼロとは?
Unix タイムスタンプ 0 は 1970 年 1 月 1 日 00:00:00 UTC です。なぜその日付が Unix エポックになったのか、負のタイムスタンプが何を表すのか、エポックの秒・ミリ秒・マイクロ秒がどう違うのか、現代のシステムにどんな上限が当てはまるのかを学びます。
Unix タイムスタンプ 0 が表すもの
すべての Unix タイムスタンプは、単一の基準点—1970 年 1 月 1 日 00:00:00 UTC—からの経過時間を数えます。Unix の元の定義では単位は秒なので、タイムスタンプ 0 はちょうど 1970 年 1 月 1 日の UTC 深夜、86400 はちょうど 24 時間後です。現代のシステムはミリ秒・マイクロ秒・ナノ秒も使いますが、基準点は同じです。正の値はエポック以降の瞬間、負の値はそれ以前の瞬間を表します。
なぜ 1970 年 1 月 1 日?
この日付は、1970 年代初頭にベル研究所の Unix 開発者が、Unix 自体の誕生の少し前という実用的な基準点として選びました。通常のシステムのタイムスタンプが正になる程度に早く、初期コンピューターの小さな整数範囲に収まる程度に新しく、頭の中で検証できる程度に単純である必要がありました。Unix が影響力を持つと、言語・OS・データベース・ログ形式・ネットワークプロトコルが同じ起点を受け継ぎました。
- Unix は 1969 年からベル研究所で開発された — エポックはその少し前に設定された
- 1 月 1 日はきれいな暦の境界として選ばれた
- 実装がゼロから始まるカウンターを使ったため、1969 年ではなく 1970 年
- 現代のあらゆる OS・言語・プロトコルがこのエポックを継承した — 競合する標準はない
負のタイムスタンプ:1970 年より前の日付
負の Unix タイムスタンプは、1970 年 1 月 1 日 00:00:00 UTC より前の瞬間を表します。現代の 64 ビットシステムの多くは正しく対応しており、歴史データ・生年月日・アーカイブ記録、そして Unix より早いエポックを持つシステムとの相互運用に役立ちます。古いライブラリやデータベースは負の値を拒否することがあるため、歴史的なデータセットは明示的な互換性チェックに値します。
- -1 = December 31, 1969 23:59:59 UTC (one second before the epoch)
- -86400 = December 31, 1969 00:00:00 UTC (one day before the epoch)
- -2208988800 = January 1, 1900 00:00:00 UTC
- JavaScript: new Date(-86400 * 1000).toISOString() → '1969-12-31T00:00:00.000Z'
形式の実用的な上限
Unix エポック自体が上限なのではなく、保存型が上限です。32 ビット符号付き整数に保存されたタイムスタンプは、64 ビット整数・JavaScript の数値・データベースのネイティブ timestamp 型よりはるかに早く破綻します。タイムスタンプの安全性を評価するときは、どの単位かと、どの数値型で保存されるかの両方を問いましょう。
- 32-bit signed integer max: 2,147,483,647 = January 19, 2038 03:14:07 UTC (the Year 2038 problem)
- JavaScript Date max: 8,640,000,000,000,000 ms = September 13, 275760 CE
- 64-bit signed integer max: ~9.2 × 10^18 seconds = year ~292 billion
- PostgreSQL TIMESTAMPTZ max: January 1, 294276 CE
他システムのエポック
Unix は計算で使われる唯一のエポックではありません。他のシステムは歴史的・技術的理由から独自の基準点を定義しました。
- GPS エポック:1980 年 1 月 6 日 00:00:00 UTC — GPS 衛星と受信機が使用
- Windows FILETIME:1601 年 1 月 1 日 00:00:00 UTC — 100 ナノ秒間隔
- Apple Cocoa / NSDate:2001 年 1 月 1 日 00:00:00 UTC
- Excel / Lotus 1-2-3:1900 年 1 月 1 日 — Lotus 互換のための意図的なうるう年バグ付き
- FAT ファイルシステム:1980 年 1 月 1 日 00:00:00 ローカル時刻
エポックの秒・ミリ秒・マイクロ秒・ナノ秒
timestamp という語は必ずしも単位を示しません。Unix 秒は OS やバックエンド言語で一般的、Unix ミリ秒は JavaScript やブラウザ API で一般的です。マイクロ秒とナノ秒はデータベース・トレースシステム・高解像度ログに現れます。単位は精度と表示される桁数の両方を決めます。
- Seconds: 1700000000 — common in Python, PHP, Go, Ruby, C, and Unix command-line tools
- Milliseconds: 1700000000000 — common in JavaScript Date and many web analytics systems
- Microseconds: 1700000000000000 — common in some databases and event pipelines
- Nanoseconds: 1700000000000000000 — common in high-resolution tracing and systems languages
- Always document the unit when storing epoch values in APIs, CSV files, and database columns
エポック時間 vs UTC vs ローカル時刻
エポック時間は数です。UTC は基準の瞬間を定義する世界の時間標準です。ローカル時刻は America/New_York や Asia/Tokyo のようなタイムゾーンに基づく表示の選択です。Unix タイムスタンプはユーザーが移動しても変わりません。変わるのは整形された暦日と時刻だけです。
- 同じタイムスタンプでもタイムゾーンが異なれば異なるローカル日付として表示されうる
- UTC 出力はログ・API・サーバー間のデバッグに最適
- ローカル出力はカレンダー・UI・レポートに最適
- タイムゾーンのオフセットは整形時に適用され、Unix タイムスタンプ内には保存されない
エポック時間 FAQ
- エポック時間は常に秒?
- 古典的な Unix タイムスタンプは 1970-01-01 00:00:00 UTC からの秒ですが、多くのシステムは同じエポックでミリ秒・マイクロ秒・ナノ秒を使います。
- Unix タイムスタンプは 1970 年より前の日付を表せる?
- はい。負のタイムスタンプは Unix エポックより前の日付を表しますが、古いライブラリやデータベースは対応していないことがあります。
- Unix タイムスタンプにタイムゾーンは含まれる?
- いいえ。Unix タイムスタンプは UTC の 1 つの瞬間を表します。タイムゾーン情報は、その瞬間を読みやすいローカル日付に変換するときにのみ使われます。
- Unix タイムスタンプの最大値は?
- エポックではなく保存型によります。32 ビット符号付き整数は最大 2,147,483,647(2038 年 1 月 19 日)、64 ビット整数や JavaScript の数値は数億年に達します。詳細は 2038 年問題を参照してください。