Unix時間、POSIX時間、エポックタイムスタンプ:手短に言うと
日常のコードでは、3 つの用語は同じ数を意味します。1970-01-01 00:00:00 UTC からの秒数です。違いはその出自にあります。「Unix時間」は初期の Unix と C ライブラリから受け継がれた慣習です。「POSIX時間」は同じカウントを正式な標準(IEEE Std 1003.1)として書き下したもので、1 日を正確に 86,400 秒に固定します。「エポックタイムスタンプ」は 3 つの中で最も総称的です——「エポック」とは単なる固定の基準時点であり、ほぼ常に 1970 年の Unix エポックを指しますが、他のシステム(NTP、GPS、Windows)は異なるエポックから数えます。下の表は各用語をその標準と、うるう秒の扱いに対応づけます。
| 用語 | 数えるもの | 定義元 | うるう秒 | 備考 |
|---|---|---|---|---|
| Unix時間 | 1970-01-01 00:00:00 UTC からの秒数 | 慣習(Unix / C ライブラリ) | 無視 | 開発者が日常的に使う名称 |
| POSIX時間 | 固定式によるエポックからの秒数 | IEEE Std 1003.1 §4.16 | 無視 — 1 日は正確に 86,400 秒 | Unix時間を正式に仕様化したもの |
| エポックタイムスタンプ | 固定エポック(通常は Unix エポック)からのカウント | 総称 — エポックは様々 | エポック/システムによる | 「エポック」は基準時点であり、必ずしも 1970 年ではない |
| エポックミリ秒 | 1970-01-01 UTC からのミリ秒 | 同じエポック、より細かい単位 | 無視 | 現在 13 桁。JavaScript と Java の既定 |
エポックタイムスタンプとは
エポックタイムスタンプは、エポックと呼ばれる固定の基準時点から測った数値カウントです。開発者の日常的な用法では、エポックタイムスタンプは通常 Unix タイムスタンプを意味します——1970 年 1 月 1 日 00:00:00 UTC からの秒数です。値が 0 なら正確に Unix エポックを意味します。正の値は 1970 年より後、負の値は前です。要となる語は「エポック」で、開始時点を名づけ、あとはそこから数えるだけです。素朴な定義とタイムスタンプ 0 の意味については「エポック時間の解説」を参照してください。本記事は 3 つの競合する名称がどう関係するかに焦点を当てます。
Unix時間 vs POSIX時間:標準は何と言っているか
Unix時間と POSIX時間は同じカウントを指しますが、正式に仕様化されているのは POSIX時間だけです。IEEE Std 1003.1——POSIX 標準——は「Seconds Since the Epoch」を、UTC のカレンダー日付を 1 つの整数に変換する明示的な式で定義します。その式の決定的な性質は、1 日を正確に 86,400 秒(60 × 60 × 24)として扱う点です。これは意図的な簡略化です。うるう秒を無視し、天文学的な正確さの代わりに、計算・ソート・保存が容易な値を得ます。「Unix時間」は同じ量の口語的な名称で標準より古く、「POSIX時間」は厳密な定義が必要なときに引用するものです。
- POSIX の式:UTC の日付が 1 つの整数に対応し、各日は 86,400 秒に固定される
- 結果:Unix/POSIX タイムスタンプは UTC を追従するが、挿入されたうるう秒を決して数えない
- time_t はそれを保持する C の型——かつては符号付き 32 ビット、今は通常符号付き 64 ビット
- 同じ瞬間 → 準拠するあらゆるシステムで、タイムゾーンやロケールに関わらず同じ値
Unix時間と POSIX時間は実際に違うことがあるか?
ほぼすべてのソフトウェアにとっては、いいえ——同じ数であり、用語は同義で使えます。違いが現れるのは、市民時刻と物理の境界だけです。どちらもうるう秒を無視するため、Unix/POSIX タイムスタンプは 1970 年からの経過 SI 秒の真のカウントではありません。1972 年以降に UTC へ挿入された 27 回のうるう秒を含みません(連続した原子時系である TAI は、2017 年以降ちょうど 37 秒 UTC より進んでいます)。うるう秒の前後では、POSIX クロックは 1 日を正確に 86,400 秒に保つため、1 秒を繰り返すか飛ばします。大手プラットフォームはこの不連続を leap smearing(うるう秒スメアリング)で回避します——余分な 1 秒を丸 1 日に分散させ、どのタイムスタンプも曖昧にならないようにします。高精度のタイミング、うるう秒をまたぐスケジューリング、または GPS や TAI との比較を行う場合、そこで「Unix」と「POSIX」は学術的でなくなり、うるう秒モデルが重要になります。
遭遇するその他のエポック
「エポックタイムスタンプ」が「Unix タイムスタンプ」を意味するのは慣習にすぎません。エポックとは単に時計が数え始める瞬間であり、広く使われるいくつかのシステムは別のエポックから数えます。ある値が Unix エポックで 2020 年代の妥当な日付にデコードされない場合、別のエポックが原因であることがよくあります。
- Unix / POSIX エポック — 1970-01-01 UTC。秒(または ms/µs)。ほぼどこでも既定
- NTP エポック — 1900-01-01 UTC。Network Time Protocol(RFC 5905)で使用
- GPS エポック — 1980-01-06。GPS 時間にはうるう秒がなく、UTC より進んでいる(2026 年時点で 18 秒)
- Windows FILETIME — 1601-01-01 UTC。100 ナノ秒間隔で数える
- JavaScript / Java — Unix エポックだがミリ秒単位。そのため値は 13 桁になる
なぜ 1970 年起点のタイムスタンプが標準になったのか
Unix エポックは初期の Unix システムにとって実用的で、Unix の考え方が C ライブラリ、Linux、データベース、Web サーバー、プログラミング言語へ広まるにつれ慣習となりました。単一の数値タイムスタンプは、ローカライズされた日付文字列より、ソート・比較・送信・保存が容易です。C ライブラリ、そして POSIX がそのカウントを標準化すると、1970 年はエコシステム全体に固定されました——だからこそ、あるプラットフォームで生成した値は、他のどのプラットフォームでも同一にデコードされます。
エポックタイムスタンプの例
いくつかの既知の値があると、定義を覚えやすくなります。
- 0 = 1970-01-01 00:00:00 UTC
- 1 = 1970-01-01 00:00:01 UTC
- 86400 = 1970-01-02 00:00:00 UTC
- 1700000000 = 2023-11-14 22:13:20 UTC
- 1767225600 = 2026-01-01 00:00:00 UTC
関連記事
FAQ
- エポック時間は Unix 時間と同じですか?
- 一般的な開発者の用法では、はい。エポック時間は通常 Unix 時間を意味します。1970-01-01 00:00:00 UTC からの経過秒数です。
- Unix 時間の定義は何ですか?
- Unix 時間は、うるう秒を数えずに 1970-01-01 00:00:00 UTC からの秒数として定義されます。
- POSIX 時間とは何ですか?
- POSIX 時間は Unix 時間を正式に仕様化したものです。IEEE Std 1003.1("Seconds Since the Epoch")は、1970-01-01 00:00:00 UTC からの秒数を数え、1 日を正確に 86,400 秒として扱う厳密な式を定めています。
- なぜ POSIX 時間はうるう秒を無視するのですか?
- 設計上の理由です。POSIX の式は値を計算・保存しやすくするため、1 日を正確に 86,400 秒に固定します。その結果、Unix/POSIX タイムスタンプは UTC を追従しますが、挿入されたうるう秒は表現しません。
- POSIX タイムスタンプはタイムゾーンを認識しますか?
- いいえ。POSIX タイムスタンプは 1 つの瞬間を表します。タイムゾーンは、その瞬間を読みやすい日付として整形するときにのみ適用されます。
- エポックタイムスタンプは Windows、Linux、macOS で同じですか?
- Unix エポック(1970-01-01 00:00:00 UTC)は最新のプラットフォームと言語で同一なので、同じ瞬間はどこでも同じ Unix タイムスタンプになります。Windows は内部的に独自の FILETIME エポック(1601 年)を使いますが、標準の Unix および POSIX タイムスタンプは 1970 年を使います。