データベースで 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:00 | 0 |
| 2000-01-01 00:00:00 | 946684800 |
| 2024-03-29 00:00:00 | 1711670400 |
| 2038-01-19 03:14:07 | 2147483647(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) カラムを使っているシステムは移行計画が必要です。
INT UNSIGNED は 2106年まで、BIGINT はほぼ無制限です。新規システムでは BIGINT または DB ネイティブの DATETIME/TIMESTAMP 型(64ビット対応済み)の使用を推奨します。
8. 主な活用シーン
- DB のレコード時刻:
created_at・updated_at・deleted_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 という静かな基準点があることを思い出してください。