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分前」など)