ゆるテックノート

Unix時間とは?

Unix時間は「1970年1月1日 00:00:00(UTC)からの経過秒数」を整数で表した時刻表現です。シンプルで比較や計算がしやすく、OS・プログラミング言語・データベース・APIなど幅広く使われています。

Unix時間の概要

Unix時間(Unix Time / POSIX time)は、コンピュータが内部で時間を扱うための共通フォーマットです。1970-01-01T00:00:00Z(エポック)を起点に、経過「秒」を数えます(通常はUTC基準)。

主要なポイント

  • 基準点(エポック):1970-01-01 00:00:00 UTC を 0 とする
  • 単位:秒が基本(ミリ秒・マイクロ秒・ナノ秒を使う実装もある)
  • タイムゾーン非依存:内部表現はUTC基準。表示時にのみローカル時刻へ変換

エポックとUTC・タイムゾーン

Unix時間はUTC基準でカウントされます。人に見せるときだけ、タイムゾーン(例:JST = UTC+9)に変換します。

よくある誤解

  • 「Unix時間にJST版がある」わけではない:常にUTCの秒数。JSTは表示時の変換
  • 夏時間(DST)の有無は「表示側」のローカルタイムゾーン解釈で決まる

表現形式(秒・ミリ秒・ナノ秒)

Unix時間は整数1つで表されますが、精度により桁が変わります。

代表的な単位

  • 秒:1735689600 のような10桁前後(現在時点)
  • ミリ秒:JavaScriptなどで一般的(例:1735689600000)
  • マイクロ秒/ナノ秒:高精度計測やDBで使用されることがある

桁判定の目安

  • 13桁ならミリ秒、10桁なら秒の可能性が高い(実装依存に注意)

各言語・シェルでの変換例

日付⇄Unix時間の相互変換は、ログ解析、期限計算、API連携で頻出します。

シェル(GNU date)

  • 現在→秒:`date +%s`
  • 秒→UTC:`date -u -d @1735689600 +"%Y-%m-%dT%H:%M:%SZ"`
  • JST表示:`TZ=Asia/Tokyo date -d @1735689600 +"%Y-%m-%d %H:%M:%S %Z"`

Python

  • `import time; int(time.time())` # 現在の秒
  • `from datetime import datetime, timezone; datetime.fromtimestamp(1735689600, tz=timezone.utc)`

JavaScript

  • `Math.floor(Date.now() / 1000)` // 現在の秒
  • `new Date(1735689600 * 1000).toISOString()` // UTC ISO8601

PHP

  • `time()` // 現在の秒
  • `(new DateTime("@1735689600"))->setTimezone(new DateTimeZone("Asia/Tokyo"))->format("Y-m-d H:i:s")`

SQL(MySQL / PostgreSQL)

  • MySQL: `FROM_UNIXTIME(1735689600)` / `UNIX_TIMESTAMP(NOW())`
  • PostgreSQL: `to_timestamp(1735689600)` / `EXTRACT(EPOCH FROM now())`

注意点(2038年問題・うるう秒・時差)

実務では以下の落とし穴に注意すると安全です。

2038年問題(time_tが32ビットの場合)

  • 2038-01-19 03:14:07 UTC で 32bit 符号付き整数がオーバーフロー
  • サーバや言語ランタイム、DBの time_t / 時刻型が64ビット対応か確認

うるう秒

  • 多くの実装は 1日=86400秒 前提でうるう秒を個別扱いしない
  • 時刻同期(NTP)や「スミア」方式のずらし方の違いで境界秒の解釈がずれる

タイムゾーンと表示

  • 内部はUTCで保持し、入出力でタイムゾーンを明示的に指定する
  • APIやDB間で秒/ミリ秒の単位違いに要注意(桁数で誤変換しやすい)

実務ベストプラクティス

ロギング、API、DB保存、フロント表示の一貫性を保ち、単位ミスや時差起因の不具合を防ぎます。

推奨事項

  • 内部保存はUTCで統一(Unix秒 or ISO8601のUTC文字列)
  • I/F仕様書に「単位(秒/ミリ秒)」と「タイムゾーン」を明記
  • テストでは境界(うるう年、月末、00:00:00、桁違い)を含める
  • 可観測性:ログにUTCとローカル(例:JST)の両方を出せる仕組みが便利

よくある質問

Q. Unix時間はJSTですか?

  • A. いいえ。UTC基準の秒数です。表示時にJSTへ変換します。

Q. 10桁と13桁の違いは?

  • A. 10桁は秒、13桁はミリ秒の可能性が高いです(実装仕様を確認してください)。

Q. 2038年問題の影響は?

  • A. 32ビット time_t の環境で不具合が起こり得ます。64ビット対応を確認しましょう。

主な用途

利用例

  • サーバーログや監視のタイムスタンプ
  • APIの有効期限(exp, iat など)
  • DBのイベント時刻・ソート・範囲検索
  • フロントエンドでの相対時刻表示(「5分前」など)