Unix Timestamp とは?仕組みと活用法を徹底解説

データベースで 1711699200 という数字を見たり、API レスポンスに "created_at": 1711699200 が含まれていたりすることがあります。これが Unix timestamp(Unixタイムスタンプ)です。ほぼすべてのプログラミング言語・OS・データベースが対応している、最も汎用的な時刻表現法です。本記事では Unix timestamp の定義から実践的な活用法まで丁寧に解説します。

1. Unix Timestamp とは

Unix timestamp は、Unix Epoch(エポック)——1970年1月1日 00:00:00 UTC——から特定の時刻までに経過した秒数を表す整数値です。

人間が読める時刻(UTC)Unix Timestamp
1970-01-01 00:00:000
2000-01-01 00:00:00946684800
2024-03-29 00:00:001711670400
2038-01-19 03:14:072147483647(32ビット上限)

重要なポイントは、Unix timestamp は UTC(協定世界時) を基準としており、タイムゾーン情報を持ちません。同じ timestamp は東京(UTC+9)・ロンドン(UTC+0)・ニューヨーク(UTC-5)で同じ絶対時刻を指します。表示される現地時刻が異なるだけです。

2. なぜ 1970年 が起点なのか

天文学的・暦学的な特別な意味はなく、純粋に歴史的な経緯です。Unix OS が 1969〜1970 年頃に開発され、設計者が時刻の「ゼロ点」として 1970年1月1日 00:00:00 UTC を選びました。以降、Unix 互換システムがすべてこれを踏襲し、事実上の標準(de facto standard)となりました。

他にも時刻の起点はあります。Windows NT Epoch は 1601年1月1日、NTP は 1900年1月1日、Apple Core Data は 2001年1月1日です。相互変換する際は注意が必要です。

3. Unix Timestamp の主なメリット

  • タイムゾーン非依存:絶対秒数なので、どのタイムゾーンでも同じ数値が同じ時刻を指します。国際システムでの時刻共有に最適です。
  • 整数で比較が簡単:「イベント A は B より前か?」は整数の大小比較だけで判定できます。閏年や月の日数を考慮する必要がありません。
  • 保存・転送が容易:64ビット整数 1 つで表現できるため、DBカラム・JSONフィールド・HTTP ヘッダーに簡単に格納できます。
  • 時間計算が単純:「3日前の記事か?」は現在の timestamp から記事の timestamp を引いて 86400 で割るだけです。

4. ミリ秒タイムスタンプ

精度が求められる現代システムでは、ミリ秒(millisecond)タイムスタンプ——Unix Epoch からのミリ秒数(秒数 × 1000)——が使われることも多いです。JavaScript の Date.now() は代表例です。

混同しやすいポイント:1711670400(10桁)は秒、1711670400000(13桁)はミリ秒です。ミリ秒を秒として扱うと西暦5万年ごろの日付が返ってきます。目安:10桁 = 秒、13桁 = ミリ秒

5. 各言語での Unix Timestamp 取得方法

# PHP
time()                          // 秒
round(microtime(true) * 1000)  // ミリ秒

# Python
import time
int(time.time())               // 秒
int(time.time() * 1000)        // ミリ秒

# JavaScript
Math.floor(Date.now() / 1000)  // 秒
Date.now()                     // ミリ秒

# Java
System.currentTimeMillis() / 1000  // 秒
System.currentTimeMillis()         // ミリ秒

# Go
time.Now().Unix()              // 秒
time.Now().UnixMilli()         // ミリ秒

# Bash / Shell
date +%s                       // 秒

6. Unix Timestamp を人間が読める形式に変換するには

各言語に標準関数があります。PHP の例:

// timestamp → 日付文字列
$ts = 1711670400;
echo date('Y-m-d H:i:s', $ts);        // サーバーのローカル時刻
echo gmdate('Y-m-d H:i:s', $ts);      // UTC 強制

// 日付文字列 → timestamp
$ts = strtotime('2024-03-29 00:00:00 UTC'); // 1711670400

7. 2038年問題(Y2K38)

Unix timestamp を 32ビット符号付き整数(signed int32) で保存する場合、最大値は 2147483647、これは 2038年1月19日 03:14:07 UTC に対応します。この時刻を超えるとオーバーフローが発生し、負の値になって 1901年と誤認識されます。これが「2038年問題(Y2038 problem)」です。

現代の OS(Linux カーネル 5.6+)とほぼすべての 64ビット言語は 64ビット整数 に移行済みで、約 2920億年後まで表現可能です。ただし、旧来の 32ビット C ライブラリや INT(11) カラムを使っているシステムは移行計画が必要です。

開発上の注意
MySQL などのデータベースで timestamp を数値として保存する場合、INT UNSIGNED は 2106年まで、BIGINT はほぼ無制限です。新規システムでは BIGINT または DB ネイティブの DATETIME/TIMESTAMP 型(64ビット対応済み)の使用を推奨します。

8. 主な活用シーン

  • DB のレコード時刻created_atupdated_atdeleted_at カラムに timestamp を使うとストレージ効率と検索性能が向上します。
  • API レスポンス:REST API での時刻伝達に timestamp を使うと、数値比較やソートが容易になります。
  • JWT・認証トークン:JSON Web Token の exp(有効期限)と iat(発行時刻)は Unix timestamp です。
  • ログシステム:timestamp でイベントを記録することで、時間範囲でのフィルタリングが簡単になります。
  • フロントエンドの相対時間表示:「3分前」「昨日」などの相対時刻は、Date.now()

まとめ

Unix timestamp はただの数字の羅列に見えますが、現代ソフトウェア全体を支える共通の時間言語です。1970年を起点とする絶対秒数・タイムゾーン非依存・純粋な整数演算という原理を理解することで、API ドキュメントの解読、時間関連バグのデバッグ、堅牢なシステム設計に役立てることができます。次に 10桁の数字を見たら「秒」、13桁なら「ミリ秒」——そしてその背後には 1970年1月1日 00:00:00 UTC という静かな基準点があることを思い出してください。