UNIXタイムスタンプとは?1970年起点の秒数とエポック時間をやさしく解説
UNIXタイムスタンプは、ログやデータベース、API応答など開発現場のあらゆる場所で使われる「時刻の数値表現」です。本記事では「UNIXタイムスタンプとは何か」から、1970年起点という基準の意味、タイムゾーンとの関係、ミリ秒表現、2038年問題、そして日時との相互変換のやり方までを、初心者向けにやさしく解説します。
ログファイルを開いたら「1750000000」のような大きな数字が時刻として並んでいた、APIのレスポンスに created_at: 1719500000 と書かれていた——開発に触れると、人間には読めない数値で時刻が表現される場面に必ず出会います。これがUNIXタイムスタンプです。本記事では、その正体と仕組み、つまずきやすいポイント、そして読みやすい日時への変換方法を解説します。
UNIXタイムスタンプとは何か
UNIXタイムスタンプ(UNIX time、エポック秒、POSIX時間とも呼ばれます)は、ある基準時刻からの経過秒数で時刻を表す方式です。基準となるのは協定世界時(UTC)の1970年1月1日 0時0分0秒で、この瞬間を「0」とし、そこから何秒経過したかを整数で表します。
たとえば 1719500000 という値は、1970年の起点から約17億秒が経過したことを意味し、UTCでは2024年6月27日ごろに相当します。年・月・日・時・分・秒という6つの要素を持つ通常の日時表現と違い、UNIXタイムスタンプはたった1つの数値で時刻を表せるのが最大の特徴です。
この方式が広く使われる理由は明快です。
- 計算が簡単:2つの時刻の差(経過時間)は、ただの引き算で求められます。「1時間後」は3600を足すだけです。
- 比較が簡単:どちらが新しいかは数値の大小を比べるだけで判定できます。並べ替えも容易です。
- あいまいさがない:書式(YYYY/MM/DDなのかMM-DD-YYYYなのか)に悩む必要がなく、世界中どこでも同じ値になります。
このため、データベースの保存値、ログの記録、Cookieやトークンの有効期限、ファイルの更新時刻など、機械が時刻を扱うほぼすべての場面で採用されています。
なぜ1970年が起点なのか(エポック)
基準となる時刻のことをエポック(epoch)と呼びます。UNIXタイムスタンプのエポックが「1970年1月1日」なのは、この方式が1970年代初頭に開発されたOS「UNIX」で採用されたためです。当時の開発に都合のよいキリのよい日付として、近い将来の1970年1月1日が選ばれました。それが今や世界標準として定着しています。
ここで重要なのは、UNIXタイムスタンプは常にUTC(協定世界時)を基準にしているという点です。エポックは「日本時間の1970年1月1日」ではなく「UTCの1970年1月1日」です。つまり、地球上のどこでカウントしても、同じ瞬間なら同じ数値になります。この「世界共通の一意な数値」という性質が、タイムゾーンをまたぐシステム連携で大きな利点になります。
タイムゾーンとの関係
初心者がもっとも混乱しやすいのが、このタイムゾーンの扱いです。結論から言うと、UNIXタイムスタンプそのものにはタイムゾーンの情報が含まれていません。値はあくまでUTC基準の通し番号であり、タイムゾーンは「表示するとき」に初めて関係してきます。
たとえば同じ 1719500000 という値でも、表示先のタイムゾーンによって人間が読む日時は変わります。
| タイムゾーン | 表示される日時(例) |
|---|---|
| UTC(協定世界時) | 2024-06-27 16:13:20 |
| JST(日本、UTC+9) | 2024-06-28 01:13:20 |
| EST(米国東部、UTC-5) | 2024-06-27 11:13:20 |
このように、数値(時刻の実体)は1つでも、見せ方は地域によって異なります。日本で開発していると、画面表示はJSTでも内部のタイムスタンプはUTC基準であることを忘れがちです。「タイムスタンプ=UTCの通し番号」「タイムゾーン=表示時の味付け」と切り分けて理解すると、時差のバグに悩まされにくくなります。
秒・ミリ秒・マイクロ秒の違い
UNIXタイムスタンプは本来「秒単位」ですが、より細かい精度が必要な場面ではミリ秒やマイクロ秒で表されることもあります。桁数を見れば、どの単位かをおおよそ見分けられます。
| 単位 | 値の例 | 1秒あたりの大きさ |
|---|---|---|
| 秒 | 1719500000 | 10桁前後 |
| ミリ秒 | 1719500000000 | 13桁前後(×1000) |
| マイクロ秒 | 1719500000000000 | 16桁前後(×1000000) |
注意したいのは、言語やライブラリによって既定の単位が違う点です。たとえばJavaScriptの Date.now() はミリ秒を返しますが、PHPの time() やPythonの一般的な扱いは秒です。秒とミリ秒を取り違えると、1000倍ずれて「1970年付近」や「遠い未来」を指してしまうおなじみのバグになります。値が10桁なら秒、13桁ならミリ秒、と桁数を確認する習慣をつけると安全です。
2038年問題とは
UNIXタイムスタンプにまつわる有名な話題が2038年問題(Year 2038 problem)です。これは、古いシステムでタイムスタンプを32ビットの符号付き整数で保持している場合に起こりうる不具合です。
32ビット符号付き整数で表せる最大値は約21億で、これに達するのが2038年1月19日 3時14分07秒(UTC)です。この瞬間を超えると値があふれ(オーバーフロー)、負の数に回り込んで「1901年」など過去の時刻と誤認されるおそれがあります。いわば2000年問題(Y2K)の時刻版です。
もっとも、現代の多くのシステムは64ビット整数でタイムスタンプを扱うようになっており、64ビットなら数千億年先まで表現できるため実用上の心配はありません。問題になりうるのは、更新されていない古い組み込み機器やレガシーなプログラムです。新しく作るシステムでは64ビットを使う、という基本を押さえておけば十分です。
日時との相互変換のやり方
UNIXタイムスタンプは機械には便利でも、人間にはそのままでは読めません。そこで必要になるのが、タイムスタンプ ⇔ 日時の相互変換です。実務では次のような場面で頻繁に行います。
- ログやデータベースに記録された数値が、いつの時刻なのかを確認したいとき。
- 「特定の日時」を指定したテストデータやAPIパラメータを、タイムスタンプ形式で用意したいとき。
- 2つのタイムスタンプの差から、経過時間(何日・何時間か)を割り出したいとき。
こうした変換を電卓や手計算で行うのは大変です。Unixタイムスタンプ変換ツールを使えば、数値を貼り付けるだけでUTC・JSTそれぞれの読みやすい日時に変換でき、逆に日付を指定してタイムスタンプを得ることもできます。秒・ミリ秒の単位にも対応しているため、桁数で迷ったときの確認にも便利です。すべてブラウザ内で処理されるため、扱う値が外部に送信される心配もありません。
たとえばログの調査では、まず気になる数値をツールに貼り付けて日時を特定し、別の数値と比べて「処理にどれくらいかかったか」を秒数の差から把握する、といった使い方ができます。普段の開発・運用で「この数字、いつ?」と思ったら即座に答えが得られるのが利点です。
プログラミングで扱うときのコツ
最後に、UNIXタイムスタンプを扱うときに役立つ実践的なポイントをまとめます。
- 保存はUTC、表示でタイムゾーン変換:データベースには常にUTC基準のタイムスタンプを保存し、ユーザーに見せる瞬間だけ各地域の時刻に変換するのが鉄則です。これで時差のバグを大幅に減らせます。
- 単位(秒/ミリ秒)を必ず合わせる:言語間でデータをやり取りするときは、相手が秒なのかミリ秒なのかを最初に確認します。桁数チェックが手早い見分け方です。
- 新規システムは64ビットで:2038年問題を避けるため、タイムスタンプは64ビット整数で扱える設計にしておきます。
- うるう秒は通常無視される:UNIXタイムスタンプは便宜上うるう秒を数えない設計のため、ごくまれな1秒の扱いに依存する処理は避けるのが無難です。
- デバッグ時はすぐ人間可読に:ログの数値はそのまま眺めず、変換ツールで日時に直してから読むと、原因にたどり着くのが格段に速くなります。
UNIXタイムスタンプは「1970年起点の秒数」というシンプルな仕組みですが、タイムゾーンや単位を取り違えると思わぬ時差バグを生みます。基準はUTC、単位は桁数で確認、保存はUTCで表示時に変換——この3点を押さえれば、時刻まわりの処理に自信が持てるようになります。手元の数値が気になったら、まずはUnixタイムスタンプ変換ツールに貼り付けて、いつの時刻かを確かめるところから始めてみてください。
よくある質問
UNIXタイムスタンプとは何ですか?
協定世界時(UTC)の1970年1月1日0時0分0秒を起点(エポック)とし、そこからの経過秒数で時刻を表す方式です。エポック秒やPOSIX時間とも呼ばれ、1つの数値で時刻を表せるため、計算や比較が簡単でログやデータベース、APIなどで広く使われています。
なぜ1970年が起点なのですか?
この方式が1970年代初頭に開発されたOS「UNIX」で採用され、当時の都合のよいキリのよい日付として近い将来の1970年1月1日が選ばれたためです。それが世界標準として定着し、現在まで使われ続けています。基準は必ずUTCです。
UNIXタイムスタンプにタイムゾーンは含まれますか?
含まれません。値はあくまでUTC基準の通し番号で、タイムゾーンは表示するときに初めて関係します。同じ値でもUTCとJST(日本、UTC+9)では表示される日時が9時間ずれます。保存はUTC、表示でタイムゾーン変換が基本です。
秒とミリ秒はどう見分けますか?
桁数で判断できます。10桁前後なら秒、13桁前後ならミリ秒、16桁前後ならマイクロ秒です。JavaScriptのDate.now()はミリ秒、PHPのtime()は秒を返すなど言語で既定が異なるため、取り違えると1000倍ずれるバグになります。
2038年問題とは何ですか?
タイムスタンプを32ビット符号付き整数で保持する古いシステムで、2038年1月19日にオーバーフローが起き、時刻を誤認するおそれがある問題です。現代の多くのシステムは64ビットで扱うため心配はなく、新規システムも64ビットにしておけば回避できます。