APIのレスポンスで "created_at": 1745913600 のような値を見たことはありますか?この一見謎めいた整数が、UNIXタイムスタンプです。プログラムの世界で時刻を表現するための標準フォーマットであり、その仕組みと正しい使い方はすべての開発者が身につけるべき基礎知識です。
1. UNIXタイムスタンプとは?
UNIXタイムスタンプは、1970年1月1日 00:00:00 UTC(Unix Epoch)からある時点までの経過秒数を表す整数です。例えば 1745913600 は 2026年4月29日 00:00:00 UTC を表します。
人間が読める文字列ではなくこの整数を使う理由は主に3つあります:
- タイムゾーン中立:同じ整数が世界中のシステムで同じ絶対時刻を意味し、「東京時間」「ニューヨーク時間」の曖昧さが生じない
- 計算が容易:2つの時点の差分計算やイベントの順序付けが整数の比較だけで完結する
- フォーマット統一:言語やDBが異なっても同一の整数を曖昧なく解釈できる
タイムスタンプを今すぐ変換:Unixタイムスタンプ変換ツールを使えば、タイムスタンプと人間が読める日時を即座に相互変換できます。秒・ミリ秒両対応、主要タイムゾーンの対応時刻も表示します。
2. 秒 vs ミリ秒:最も多い混同トラップ
| フォーマット | 例 | 説明 |
|---|---|---|
| 秒(seconds) | 1745913600 | 10桁 — UNIX標準、C/Python/PHPで使用 |
| ミリ秒(milliseconds) | 1745913600000 | 13桁 — JavaScriptのDate.now()がこの形式 |
| マイクロ秒(microseconds) | 1745913600000000 | 16桁 — 一部DBや高精度システムで使用 |
見分け方:桁数で判断。10桁 → 秒、13桁 → ミリ秒。13桁のタイムスタンプを秒として解釈すると、西暦58000年という日時になります――初学者が最もよく踏む落とし穴のひとつです。
3. API設計:時刻フィールドのベストプラクティス
| 形式 | 例 | メリット | デメリット |
|---|---|---|---|
| UNIXタイムスタンプ(秒) | 1745913600 | 高速計算・タイムゾーン曖昧さなし | 人間には読みにくい |
| ISO 8601文字列 | 2026-04-29T00:00:00Z | 人間が読める・タイムゾーン情報含む | 言語によりパースが異なる |
- 内部APIには整数を使い、タイムゾーン解釈ミスを防ぐ
- 公開APIにはISO 8601を使い、開発者が読みやすくする
- 常にUTCで保存・送信し、表示時のみユーザーのタイムゾーンへ変換する
タイムゾーン付きの時刻文字列が返ってきた?世界時計ツールで各タイムゾーンの現在時刻を素早く確認し、変換が正しいかを検証できます。
4. データベース保存:INT・DATETIME・TIMESTAMPの選択
| 型 | 例 | 適した場面 | 注意点 |
|---|---|---|---|
BIGINT | 1745913600 | 高速クエリ・DB間移植 | 2038年問題を回避するためBIGINTを推奨 |
DATETIME | 2026-04-29 00:00:00 | 人間が読めるDB、タイムゾーン非依存 | MySQLのDATETIMEはTZ情報を保持しない |
TIMESTAMP | 2026-04-29 00:00:00 | MySQLのTZ自動変換 | 2038年上限あり(MySQL 8で部分的に改善) |
2038年問題:32ビット符号付き整数の最大値は2038年1月19日 03:14:07 UTCに対応し、超えるとオーバーフローします。64ビット整数(BIGINT)を使えば数十億年先まで安全に使えます。
5. 多言語タイムスタンプ操作クイックリファレンス
JavaScript
const ms = Date.now(); // ミリ秒 const sec = Math.floor(Date.now() / 1000); // 秒 const date = new Date(1745913600 * 1000); // タイムスタンプ → Date const ts = Math.floor(date.getTime() / 1000); // Date → タイムスタンプ(秒)
Python
import time, datetime, timezone ts = time.time() dt = datetime.datetime.fromtimestamp(1745913600, tz=timezone.utc) ts = dt.timestamp()
PHP
$ts = time();
echo date('Y-m-d H:i:s', $ts);
$ts = strtotime('2026-04-29 00:00:00 UTC');
6. よくある間違い
| ミス | 症状 | 対処法 |
|---|---|---|
| ミリ秒を秒として扱う | 西暦58000年の日付が表示される | 1000で割るかフィールドの単位を確認 |
| ローカル時刻をUTCフィールドに保存 | 8時間のズレ(UTC+9の場合) | 常にUTCで保存し表示時に変換 |
| 32ビットINT使用 | 2038年以降にオーバーフロー | BIGINTを使用 |
| 文字列にタイムゾーンを指定しない | サーバーにより解釈が異なる | ISO 8601にZまたは+09:00を付与 |
まとめ
- タイムスタンプは「1970-01-01 00:00:00 UTCからの経過秒数」でタイムゾーンに依存しない
- 10桁=秒、13桁=ミリ秒——混同は最もよくあるバグのひとつ
- API設計:内部は整数、公開はISO 8601、常にUTC
- DB:BIGINTで保存し2038年問題を回避
- 全主要言語に変換用の標準ライブラリがある