TegaruTools
ユーティリティガイド

タイムスタンプ完全ガイド|Unix時間とは何かと実用での扱い方

ログやAPIで頻出する「1718198400」のような数字、これがUnixタイムスタンプです。仕組み・単位の違い・各言語での扱い方・2038年問題まで、実務で必要な知識を一気にまとめます。

公開: 2026年6月13日読了 約8TegaruTools

ログファイルや API レスポンスでよく見かける「1718198400」のような10桁ほどの数字。これは Unix タイムスタンプ と呼ばれる時刻の表現方法です。

人間にとっては「いつのこと?」と一目で分からない形式ですが、コンピューターにとっては最も扱いやすい時刻表現で、世界中のサーバー・データベース・API で標準的に使われています。この記事では、Unixタイムスタンプの仕組みと、実務での扱い方を一気にまとめます。

Unixタイムスタンプとは何か

Unixタイムスタンプは、1970年1月1日 00:00:00 UTC(協定世界時)からの経過秒数 として時刻を表す方式です。エポック秒、POSIX時間、Unix時間とも呼ばれます。

例:

  • 0 → 1970年1月1日 00:00:00 UTC(起点)
  • 1000000000 → 2001年9月9日(10億秒記念日)
  • 1718198400 → 2024年6月12日 12:00:00 UTC

本サイトの タイムスタンプ変換ツール で、数値と日時を相互変換できます。

なぜ「1970年1月1日」が起点なのか

この日付は、Unix オペレーティングシステム(現在の macOS や Linux のルーツ)が開発された時期に近いことから選ばれました。1971年に Unix 第1版が登場し、その内部で時刻を扱う基準として「キリのいい日付」が必要だったため、1970年1月1日 00:00:00 UTC がエポック(起点)として定められました。

これにより、すべての時刻は「起点からの秒数」という単一の整数で表現できるようになりました。タイムゾーン、夏時間、月の長さの違いといった面倒な計算を、システムレベルで一切無視できる強力な設計です。

Unixタイムスタンプを使う利点

  • 計算が単純:差を取れば経過秒数、加算すれば未来時刻、というシンプルな算術で時刻計算ができる。
  • タイムゾーン非依存:すべてUTCを基準にしているため、サーバーが世界中のどこにあっても同じ値を共有できる。
  • 並び替えが容易:数値として扱えるので、データベースのインデックス・ソートで効率的。
  • 容量が小さい:32bitまたは64bit整数1つで時刻を表現できる。

単位の違い — 秒・ミリ秒・マイクロ秒

Unixタイムスタンプには、精度の異なる複数の単位があります。同じ瞬間を表していても、桁数で見分けられます。

  • :10桁前後(例:1718198400)。古典的なUnix時間。Linux・PHP・MySQLなどで主流。
  • ミリ秒:13桁前後(例:1718198400000)。JavaScript・Java・MongoDB などで使われる。1秒を1000分割。
  • マイクロ秒:16桁前後。一部の高精度ログで使用。
  • ナノ秒:19桁前後。Go言語の time.Time、Kubernetes ログなどで使用。

変換時のコツ:桁数を見れば一発で単位が分かります。13桁ならミリ秒、10桁なら秒。本サイトのツールもこれを自動判別します。

各プログラミング言語での扱い方

JavaScript

  • 現在時刻(ミリ秒)Date.now()
  • 現在時刻(秒)Math.floor(Date.now() / 1000)
  • 秒 → 日時new Date(秒 * 1000)(秒を入力する時は1000倍が必要)
  • ISO形式に変換new Date(...).toISOString()

Python

  • 現在時刻(秒、浮動小数点)time.time()
  • 整数の秒int(time.time())
  • 秒 → datetimedatetime.fromtimestamp(秒)
  • UTC で扱うdatetime.fromtimestamp(秒, tz=timezone.utc)

PHP

  • 現在時刻(秒)time()
  • 秒 → 文字列date("Y-m-d H:i:s", 秒)
  • 文字列 → 秒strtotime("2026-06-13")

SQL(MySQL)

  • 現在のUnix時間UNIX_TIMESTAMP()
  • Unix時間 → 日時FROM_UNIXTIME(秒)
  • 日時 → Unix時間UNIX_TIMESTAMP('2026-06-13')

UTC とローカルタイムの違い

Unixタイムスタンプ自体は UTC(協定世界時)を基準 にした単一の値で、タイムゾーンの情報を含みません。しかし、人間が見る日時はローカルタイムで表示したいことが多いです。

ここで重要なのが 「保存はUTC、表示はローカルタイム」 という原則です。

  • データベースには Unix時間 or UTC で保存:地域に依存しないため、グローバルサービスでも一貫した管理ができる。
  • 表示時にユーザーのタイムゾーンに変換:ブラウザのJavaScriptなら自動的にローカルタイムで表示される。
  • API のレスポンスは UTC で統一:「2026-06-13T12:00:00Z」のように末尾の Z でUTCを明示するのが安全。

日本時間(JST)はUTCより9時間進んでいるため、Unixタイムスタンプを日本時間に変換する場合は、UTC時刻に9時間(32400秒)を加算する形になります。

2038年問題 — まだ覚えておく価値のある話

Unixタイムスタンプを 32bit符号付き整数 で扱うシステムでは、表現できる最大値が 2147483647 までです。これは 2038年1月19日 03:14:07 UTC に到達します。

この時刻を超えると、32bitシステムは内部で数値オーバーフローを起こし、時刻が 1901年12月13日 に戻ってしまうという深刻なバグが発生します。「2038年問題(Year 2038 Problem)」と呼ばれる課題です。

対策:

  • 64bit システムへの移行:64bit整数なら約2920億年先まで表現でき、実質的に永遠に問題なし。現在の主流のサーバー・スマホはほぼ64bit。
  • 古い組込み機器の確認:センサー、決済端末、医療機器など、長期運用される組込み機器は要注意。2038年までに更新計画を立てる。
  • 古いデータベースの設計確認:MySQL の TIMESTAMP 型は内部で32bit整数を使っており、影響を受ける。DATETIME 型に変えるか、64bit化対応が必要。

実務での使いどころ

ログ解析

サーバーログには各イベントのタイムスタンプが記録されています。grepawk でログを絞り込む時、Unixタイムスタンプの範囲指定を使うと正確です。

API のキャッシュ制御

HTTPヘッダーの Last-ModifiedExpires は、Unixタイムスタンプベースで実装されています。クライアント側で「N秒前以降のデータか」を簡単に判定できます。

セッション管理

ユーザーのログインセッションの有効期限を「Unix時間で何秒後まで」と保存しておくと、現在時刻との比較で簡単に有効性を判定できます。

JWT (JSON Web Token)

JWTの中身には iat(発行時刻)、exp(有効期限)が Unixタイムスタンプ(秒) で埋め込まれます。これにより各言語のサーバーが互換性を保てます。

変換時のよくある落とし穴

  1. 秒とミリ秒を取り違える:13桁を10桁の前提で変換すると、はるか未来の日付になる。逆もまた然り。
  2. タイムゾーンの考慮漏れ:UTCで保存された値をローカルタイムだと思って読み解くと、9時間ずれた解釈になる。
  3. うるう秒:地球の自転速度の微調整で稀に挿入される「うるう秒」は、Unixタイムスタンプではほとんどの実装で扱われない(POSIX定義により無視)。1秒未満の精度が必要なシステムでは別途検討が必要。
  4. 古い API の負の値:1970年以前を表す負の値が含まれる古いデータは、一部の言語・DBで正しく扱えないことがある。

関連ツール

まとめ — 「数字に見えても、ただの秒数」

Unixタイムスタンプは一見すると「謎の数字の羅列」ですが、「1970年1月1日からの秒数」 という1行さえ覚えていれば、ログ・API・データベースのどんな場面でも対応できます。

ミリ秒との見分けは桁数で。タイムゾーンは「保存はUTC、表示はローカル」。それさえ意識すれば、現代のサーバー開発で時刻関連のトラブルに遭うことはほとんどなくなります。

この記事で紹介したツール

関連するガイド記事