UNIXタイムスタンプの実践活用:API設計・データベース保存・多言語時間処理の完全ガイド

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)174591360010桁 — UNIX標準、C/Python/PHPで使用
ミリ秒(milliseconds)174591360000013桁 — JavaScriptのDate.now()がこの形式
マイクロ秒(microseconds)174591360000000016桁 — 一部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の選択

適した場面注意点
BIGINT1745913600高速クエリ・DB間移植2038年問題を回避するためBIGINTを推奨
DATETIME2026-04-29 00:00:00人間が読めるDB、タイムゾーン非依存MySQLのDATETIMEはTZ情報を保持しない
TIMESTAMP2026-04-29 00:00:00MySQLの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年問題を回避
  • 全主要言語に変換用の標準ライブラリがある