Unix タイムスタンプとは?完全ガイド
Unix タイムスタンプとは?
Unix タイムスタンプ(POSIX 時間またはエポックタイムとも呼ばれます)は、Unix エポック — 1970 年 1 月 1 日 00:00:00 UTC — から経過した秒数を数える時刻追跡システムで、うるう秒を除きます。
タイムゾーンによって異なる人間が読める日付("July 19, 2026, 3:30 PM EST")とは異なり、Unix タイムスタンプは地球上のどこでも同じ瞬間を表す単一の整数です。たとえば、タイムスタンプ 1785292800 は、ニューヨークにいてもロンドンにいても東京にいても、特定の瞬間に対応します。
Unix タイムスタンプは、現代のコンピューティングにおける時刻処理の基盤です。オペレーティングシステム、プログラミング言語、データベース、ファイルシステムはすべて、内部でこのシンプルな整数表現に依存しています。
Unix エポック: なぜ 1970 年 1 月 1 日なのか?
1970 年 1 月 1 日を「エポック」(開始点)として選んだのは、恣意的なものではありませんでした。いくつかの実用的な考慮事項がこの決定につながりました:
- 初期の Unix 開発: Unix オペレーティングシステムは、1960 年代後半から 1970 年代前半にかけてベル研究所で開発されました。時刻システムが 1970 年代前半に標準化された時点で、1970 年 1 月 1 日は明確で最近の基準点でした。
- シンプルさ: 初期の Unix システムでは、時刻は秒を数える 32 ビット符号付き整数として保存されていました。最近の日付を使用することで、将来に向けて表現可能な範囲が最大化されました。
- 先例: エポックは最初の POSIX 標準で正式化され、Unix 系システムの普遍的な基準となりました。
それ以前の Unix 系システムでは異なるエポック日付が使用されていましたが、1970 年のエポックが勝ち残り、それ以来すべての POSIX 準拠システムの標準となっています。
タイムスタンプ値の仕組み
核となる考え方は単純です:
- タイムスタンプ
0は、正確に1970 年 1 月 1 日 00:00:00 UTC を意味します - タイムスタンプ
86400(60 × 60 × 24)は、1970 年 1 月 2 日 00:00:00 UTC を意味します - タイムスタンプ
-3600は、1969 年 12 月 31 日 23:00:00 UTC を意味します(負のタイムスタンプはエポックより前の日付を表します)
計算式は単純です:
timestamp = seconds since 1970-01-01 00:00:00 UTC
ミリ秒タイムスタンプ
特に JavaScript や Web API など、多くの最新システムは秒ではなくミリ秒を使用します。ミリ秒タイムスタンプは、単に秒ベースの値に 1000 を掛けたものです:
- JavaScript の
Date.now()はミリ秒を返します - Python の
time.time()は小数ミリ秒を含む浮動小数点数として秒を返します
変換する前に必ずシステムが使用する精度を確認してください。混在させると、数十年ずれた日付になる可能性があります。
2038 年問題
2038 年問題(「Unix ミレニアムバグ」または「Y2K38」とも呼ばれます)は、タイムスタンプを32 ビット符号付き整数として保存するシステムに影響する時刻表現の問題です。
32 ビット符号付き整数は、約 -21 億から +21 億までの値を保持できます。表現可能な Unix タイムスタンプの最大値は 2147483647 で、これは以下に対応します:
- 2038 年 1 月 19 日 03:14:07 UTC
その 1 秒後、値は -2147483648 にオーバーフローし、これは1901 年 12 月 13 日を表します — システムが現在の時刻を 20 世紀初頭の日付として解釈する原因になります。
影響を受けるシステムは?
- 32 ビットプロセッサを搭載した組み込みデバイスと IoT ハードウェア
- 古い組み込み Linux カーネル
- 32 ビット整数の時刻カラムを使用するレガシーデータベース
- 時刻を 32 ビット整数として保存するファイルシステムとバイナリ形式
修正方法
最新のシステムは、時刻保存のためにほとんど64 ビット整数に移行しています。64 ビット符号付き整数は、将来の約2,920 億年まで表せます — 実用的には事実上無限です。
- 64 ビットハードウェア上の最近のほとんどの Linux ディストリビューションはすでに安全です
- Linux カーネルは、64 ビットシステム上で何年も 64 ビットの time_t を使用しています
- カーネル 5.6 以降では、32 ビットアーキテクチャ向けの 64 ビット time_t サポートが導入されました
- Python、Go、Java などのプログラミング言語は内部で 64 ビット整数を使用します
組み込みシステムやレガシーソフトウェアを管理している場合は、今日のうちに time_t のサイズを確認する価値があります。
UTC と Unix タイムスタンプとの関係
Unix タイムスタンプは本質的にタイムゾーンに依存しません — 常に UTC を参照します。
UTC とは?
協定世界時(UTC)は、世界が時計と時刻を調整する主要な時刻標準です。これはグリニッジ標準時(GMT)に代わる国際標準となり、原子時計によって維持されています。
Unix タイムスタンプにとって UTC が重要な理由
- Unix タイムスタンプは UTC で定義されているため、タイムスタンプは世界中で同じ瞬間を表します
- Unix タイムスタンプをローカル時刻に変換することは、純粋に表示層の問題です
- タイムスタンプ自体にはタイムゾーン情報が保存されないため、システムはシンプルで移植可能に保たれます
この設計により、世界中の誰とでも Unix タイムスタンプを共有でき、双方が曖昧さなく自分のローカル時刻に変換できます。
うるう秒: 稀な例外
Unix タイムスタンプは理論上エポックからの秒数を数えますが、うるう秒を無視します。うるう秒が追加された日でも、Unix 時間では正確に 86400 秒です。つまり、うるう秒の間、Unix タイムスタンプは進まず、うるう秒は実質的にカウントから消えます。
この単純化によってシステムは実用的に保たれますが、Unix タイムスタンプが原子時計からわずかに乖離することを意味します。その差は、日常的なアプリケーションではほとんど問題にならないほど小さいものです。
一般的なタイムスタンプの範囲
| タイムスタンプ | 人間が読める日付 | 意味 | |-----------|---------------------|--------------| | 0 | 1970-01-01 00:00:00 UTC | Unix エポック | | 86400 | 1970-01-02 00:00:00 UTC | エポックの 1 日後 | | 946684800 | 2000-01-01 00:00:00 UTC | 2000 年 | | 1234567890 | 2009-02-13 23:31:30 UTC | 覚えやすいパターン | | 1785292800 | 2026-07-19 00:00:00 UTC | 今日のエポック | | 2147483647 | 2038-01-19 03:14:07 UTC | 32 ビットの最大値 |
まとめ
Unix タイムスタンプは、時刻を単一の整数として表す、洗練された移植可能な方法です。その設計 — 1970 年 1 月 1 日 UTC からの秒数を数えること — は、オペレーティングシステム、データベース、プログラミング言語を横断して、普遍的な時刻標準となっています。レガシーシステムには 2038 年問題が迫っていますが、64 ビット時刻への移行が進んでいることで、Unix タイムスタンプは今後何世代にもわたってコンピューティングの時刻管理の基盤であり続けるでしょう。
Unix タイムスタンプを実際に扱ってみませんか?当社の Unix タイムスタンプ変換ツール を使用して、タイムスタンプと人間が読める日付の間で即座に変換できます。