Unixエポックタイムスタンプとは?エポック時間を日付に変換する方法を徹底解説
コンピュータは、人間が使う自然言語(英語など)をそのまま理解できないことをご存知でしょうか?私たちが入力した命令はすべて、CPUが読み取って処理を実行する前に、バイナリコード(0と1だけで構成される2進数)へと変換されます。そして、処理結果も再び人間が読める形式へと翻訳されるのです。
ここで一つ問題が生じます。「日付」は単純な0と1だけでは表現しきれない情報だという点です。この課題を解決するため、コンピュータ科学者たちは、あらゆる日付を「共通の基準点から経過した秒数」に変換する方式を採用しました。コンピュータに日付を与えると、内部では秒数へ変換され、時刻の起点となる最初の1秒から何秒経過したかが計算されます。このコンピュータにおける時刻の原点こそが「エポックタイム(Epoch Time)」です。

豆知識
「Hello」という文字列をバイナリコードに変換すると、次のようになります。
Hello = 01001000 01100101 01101100 01101100 01101111
エポックタイムスタンプとは?
Merriam-Webster辞書では「Epoch(エポック)」を「基準点として選ばれた瞬間または日付」と定義しています。またWikipediaでは、コンピューティング分野におけるエポックを「コンピュータがシステム時刻を測定する起点となる日時」と説明しています。
興味深いことに、オペレーティングシステムごとに採用しているエポックの時点は異なります。統一された標準が定められていれば話は簡単だったのですが、実際には各社が独自の基準を採用しています。主なOSのエポック時刻は以下の通りです。
| オペレーティングシステム | エポック時刻の起点 | |
| 1 | 現実世界(UTC標準) | 00:00:00 UTC |
| 2 | Apple macOS | 1904年1月1日 |
| 3 | Microsoft Windows | 1601年1月1日 |
| 4 | Unix / Linux系システム | 1970年1月1日 |
Unixエポックタイムスタンプとは?
エポックタイムスタンプという概念を最初に導入したのはUnixオペレーティングシステムであるため、この方式は「Unixエポックタイムスタンプ」と呼ばれることが一般的になりました。最初のUnixシステムは1960年代にデニス・リッチー(Dennis Ritchie)とケン・トンプソン(Ken Thompson)によって開発され、Unixシステムの「エポック」の瞬間として1970年1月1日 00:00:00 UTCが設定されました。
Unixエポックタイムスタンプを確認する方法
Unixユーザーなら、いくつかの簡単なコマンドで現在時刻や、1970年1月1日からの経過秒数を表すUnixエポックタイムスタンプをすぐに確認できます。
現在のUnixエポックタイムスタンプを取得するには、ターミナルで以下のコマンドを入力します。
date "+%s"
取得したエポックタイムスタンプを人間が読める日付に変換するには、次のコマンドを使用します。
date -r (エポックタイム)
現在の日付を読みやすい形式で表示したい場合は、シンプルに以下を実行するだけです。
date
Unixエポックタイムスタンプの有効性と「2038年問題」とは?
Unixエポックタイムスタンプの開発者たちは、当時としては十分すぎるほど大きい値だと考え、32ビット符号付き整数を採用しました。しかし時代とともに、1秒ごとにタイムスタンプの値は増加し続けます。32ビット整数には限界があり、2038年1月19日03:14:07に最大値に達します。その直後の1秒でオーバーフローが発生し、時計は1901年12月13日へと巻き戻ってしまうのです。
これが現実になれば、世界中のUnixユーザーに大混乱をもたらし、ソフトウェアライセンスやバックアップ処理など、さまざまなシステム障害を引き起こす可能性があります。この問題は「2038年問題(Year 2038 Problem)」と呼ばれ、2000年に Windows OS で懸念されたY2K問題とよく似ています。
ただし、2038年までには32ビットシステムがほぼ姿を消していると予測されているため、深刻な混乱には至らないと考えられています。それでも懸念が残るのが、エンジン制御ユニット(ECU)に32ビットUnixシステムが組み込まれている一部の自動車です。こうした車両は2038年までしか正常に動作しないと指摘されています。

32ビットUnixエポックタイムスタンプの解決策
新しく開発されたUnixシステムでは、エポックタイムスタンプの保存に64ビット符号付き整数が採用されています。この場合、タイムスタンプがリセットされる問題が再び発生するのはなんと約140億年後。そう、宇宙の推定年齢である約138億年よりも長いのです。なお、新しい64ビット時刻を扱えるのは64ビットシステムのみで、古い32ビットシステムをそのまま64ビットへ変換することはできません。
Windows 10でもエポックタイムを取得できる?
Microsoftは独自のエポックタイムスタンプを採用していますが、基準日を指定してそこからの経過秒数を計算すれば、Windows 10でもUnixエポックタイムスタンプを取得できます。PowerShellアプリで以下のコマンドを入力してください。下記のコマンドをそのままコピーして使えます。
PowerShell -command "(New-TimeSpan -Start (Get-Date \"01/01/1970\") -End (Get-Date)).TotalSeconds"
注:指定する日付はUnixエポックタイムスタンプの起点である1970年1月1日です。
無料で使えるオンラインのエポックタイム変換ツール
コマンド操作は面倒という方には、ブラウザだけで完結するオンライン変換ツールが便利です。代表的なサービスを2つ紹介します。
- Epoch Converter
無料で利用できる人気の変換サイトです。エポック・Unixタイムスタンプを人間が読める通常の日付へ変換できます。テキストボックスにエポックタイムスタンプを入力し、「Timestamp to Human date」ボタンをクリックするだけで完了です。
- Unix Timestamp
リアルタイムで現在のエポックタイムを表示しており、ページを更新(F5)するたびに秒数が刻々と変化する様子を確認できます。もちろん、任意のUnixタイムスタンプを日付へ変換する機能もあります。たとえば「2」の後にゼロを9個並べた数値を入力してみると、13年先の日付が表示されました。

まとめ
調べる前は難解に思えたUnixエポックタイムスタンプですが、その正体はいたってシンプルです。ほとんどのコンピュータが今日の日付を秒数で計算するための出発点としている、「秒数で表された基準日」にすぎません。本記事で紹介したコマンドやオンラインツールを活用すれば、エポックタイムと日付の相互変換は誰でも簡単に行えます。
-
Pythonで日時をミリ秒単位のUNIXタイムスタンプに変換する方法
UNIXタイムスタンプは、1970年1月1日00:00:00 UTCからの経過時間を表す数値で、システム間での時刻データのやり取りによく使われます。Pythonでは、timeモジュールを使って現在時刻をミリ秒単位で簡単に取得できます。time.time()関数は、現在時刻を秒単位の浮動小数点数(float)として返します。これをミリ秒に変換するには、1000倍してから整数に丸めます。現在時刻をミリ秒のタイムスタンプとして取得するimport time milliseconds = int(round(time.time() * 1000)) print(milliseconds)実行結果151
-
PythonでUNIXタイムスタンプを読みやすい日付に変換する方法
UNIXタイムスタンプを人間が読み取れる日付に変換するには、Pythonの標準ライブラリであるdatetimeモジュールが提供するfromtimestamp関数を使用します。この関数はタイムスタンプを引数として受け取り、その時刻に対応するdatetimeオブジェクトを返します。基本的な使い方fromtimestamp()は、1970年1月1日(UTC)からの経過秒数をローカル時刻のdatetimeオブジェクトに変換してくれます。以下に具体的な例を示します。import datetime timestamp = datetime.datetime.fromtimestamp(150000000