データベースや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:000
2000年1月1日 00:00:00946684800
2024年1月1日 00:00:001704067200
2026年3月18日 00:00:001773964800

このように、どんな日時でも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ビット化により解決が進んでいます。エンジニアとして必ず押さえておきたい基礎知識ですので、当サイトの変換ツールで実際にタイムスタンプと日時の変換を体験してみてください。