データベースやAPI、ログファイルなどで「1710720000」のような大きな数字を見たことはありませんか?これがUnixタイムスタンプです。エンジニアにとって時刻管理の基礎となる概念であり、Web開発やシステム運用で欠かせない知識です。この記事では、Unixタイムスタンプの仕組みから実際の使い方まで、初心者の方にもわかりやすく解説します。
Unixタイムスタンプとは
Unixタイムスタンプ(Unix timestamp)とは、1970年1月1日 00:00:00(UTC)からの経過秒数で時刻を表現する方法です。「Unixタイム」「エポック秒」「POSIX時間」とも呼ばれます。
例えば、以下のように変換されます。
| 日時(UTC) | Unixタイムスタンプ |
|---|---|
| 1970年1月1日 00:00:00 | 0 |
| 2000年1月1日 00:00:00 | 946684800 |
| 2024年1月1日 00:00:00 | 1704067200 |
| 2026年3月18日 00:00:00 | 1773964800 |
このように、どんな日時でも1つの整数で表現できるのがUnixタイムスタンプの特徴です。
Unixエポックの由来
「1970年1月1日」が基準日として選ばれた理由には歴史的な経緯があります。Unixオペレーティングシステムが開発されたのは1960年代後半から1970年代初頭です。当時のコンピュータはメモリが非常に限られており、時刻を効率的に管理する必要がありました。
初期のUnixでは32ビット符号付き整数でタイムスタンプを保存していました。基準日を1970年1月1日にすることで、当時のシステムが扱う時間範囲をカバーできたのです。この設計は非常にシンプルで効果的だったため、Unix以外のシステムでも広く採用されるようになりました。
なお、「エポック(epoch)」は「起点」「基準点」を意味する英語で、Unixエポックとは「Unix時間の起点」という意味です。
なぜ秒数で管理するのか
「2024年1月1日 12:00:00」のような人間にわかりやすい表記があるのに、なぜわざわざ秒数で管理するのでしょうか?主な理由は以下の3つです。
1. タイムゾーンに依存しない
文字列で「2024/01/01 12:00:00」と記録しても、それが日本時間なのかUTCなのかわかりません。Unixタイムスタンプは常にUTC基準なので、世界中どこでも同じ値で同じ瞬間を表せます。
2. 計算が簡単
2つの日時の差分を求めるのは、単純な引き算で済みます。「3日後」を計算するには 3 x 86400(1日の秒数)を足すだけです。
// 2つのイベントの時間差を求める
const diff = timestamp2 - timestamp1;
const hours = Math.floor(diff / 3600);
console.log(`${hours}時間の差`);
// 7日後のタイムスタンプ
const oneWeekLater = now + (7 * 24 * 60 * 60);
3. ソートや比較が容易
ただの整数なので、データベースでのソートや、プログラムでの大小比較が高速に行えます。文字列の日時フォーマットでは、フォーマットの違いにより正しく比較できないケースがありますが、タイムスタンプならその心配がありません。
2038年問題とは
Unixタイムスタンプには有名な問題があります。それが2038年問題(Year 2038 Problem)です。
32ビット符号付き整数で表現できる最大値は 2,147,483,647 です。この値に対応する日時は2038年1月19日 03:14:07(UTC)です。この瞬間を超えると、32ビットシステムではオーバーフローが発生し、タイムスタンプが負の値(1901年12月13日)に戻ってしまいます。
32ビット符号付き整数の最大値: 2,147,483,647
対応する日時: 2038-01-19 03:14:07 UTC
次の秒: オーバーフロー → 1901-12-13 20:45:52 UTC
これは「Y2K問題(2000年問題)」と同様の桁あふれ問題です。対策として、現在のほとんどのシステムでは64ビット整数でタイムスタンプを管理するよう移行が進んでいます。64ビットなら約2920億年後まで表現でき、実質的に問題は解消されます。
ただし、組み込みシステムやレガシーなソフトウェアでは32ビットのままのものもあり、2038年に向けた対応が課題となっています。
プログラミング言語での扱い方
主要なプログラミング言語でのタイムスタンプの取得・変換方法を紹介します。
JavaScript
// 現在のタイムスタンプ(秒)
const now = Math.floor(Date.now() / 1000);
console.log(now); // 例: 1773964800
// タイムスタンプ → 日時文字列
const date = new Date(1773964800 * 1000);
console.log(date.toISOString());
// → "2026-03-18T00:00:00.000Z"
// 日時 → タイムスタンプ
const ts = Math.floor(new Date("2026-03-18").getTime() / 1000);
console.log(ts); // 1773964800
JavaScriptのDate.now()はミリ秒を返すため、秒に変換するには1000で割る必要がある点に注意してください。
Python
import time
from datetime import datetime
# 現在のタイムスタンプ
now = int(time.time())
print(now)
# タイムスタンプ → datetime
dt = datetime.fromtimestamp(1773964800)
print(dt) # 2026-03-18 09:00:00(JST)
# datetime → タイムスタンプ
ts = int(datetime(2026, 3, 18).timestamp())
print(ts)
PHP
// 現在のタイムスタンプ
echo time();
// タイムスタンプ → 日時
echo date("Y-m-d H:i:s", 1773964800);
// 日時 → タイムスタンプ
echo strtotime("2026-03-18 00:00:00");
実務で役立つTips
ミリ秒 vs 秒の注意
JavaScriptやJavaではミリ秒のタイムスタンプが使われることが多く、桁数が13桁になります。一方、Unix標準やPython、PHPでは秒(10桁)が一般的です。APIの仕様書を読む際は、どちらの単位か必ず確認しましょう。
タイムゾーンの落とし穴
タイムスタンプ自体はUTC基準ですが、人間向けの日時に変換する際にタイムゾーンが関係します。日本時間(JST)はUTC+9なので、表示時に9時間のずれが生じます。システム間でデータをやり取りする場合は、常にUTCで統一するのがベストプラクティスです。
Unixタイムスタンプの変換を試してみましょう
Unixタイムスタンプ変換ツールを使ってみるまとめ
Unixタイムスタンプは、1970年1月1日からの経過秒数で時刻を表現するシンプルで強力な仕組みです。タイムゾーンに依存しない、計算が容易、ソートが速いなど多くのメリットがあり、データベース、API、ログなどあらゆる場面で使われています。
2038年問題という課題はありますが、64ビット化により解決が進んでいます。エンジニアとして必ず押さえておきたい基礎知識ですので、当サイトの変換ツールで実際にタイムスタンプと日時の変換を体験してみてください。