Unixタイムスタンプの仕組みと2038年問題(ミリ秒・秒変換とコード例)
プログラミング データベース DevOps
Unixタイムスタンプ(POSIX time / Epoch time)の構造、2038年問題の発生原因、およびプログラミング言語・データベースでの日時変換手法です。
1. Unixタイムスタンプ 相互変換ツール
現在のUnixタイムスタンプの取得および日時(ISO 8601 / 日時文字列)との相互変換が行えます。
⏰ この場でタイムスタンプを変換する
現在のタイムスタンプ:
2. 2038年問題(Year 2038 Problem)とは
発生原因:32bit 符号付き整数のオーバーフロー
古いシステムや32bitアーキテクチャでは、Unixタイムスタンプを 32bit 符号付き整数(int32_t)として保持しています。
- 32bit 符号付き整数の最大値: $2^31 - 1 = 2,147,483,647$
- 到達日時: 2038年1月19日 03:14:07 (UTC)
- 障害内容: 1秒後の 03:14:08 にビットが溢れて符号反転し、1901年12月13日 20:45:52 (UTC) として認識されてシステムが誤作動・クラッシュします。
現代の回避策
- 64bit整数(
int64_t/BIGINT)への移行: 64bitでの上限は約2922億年後のため問題は解消されます。 - DBスキーマの修正: MySQL等のデータベースでタイムスタンプ保存用カラムを
INTからBIGINTまたはDATETIME/TIMESTAMP(64bit対応版) へ変更します。
3. 主要言語・SQL での変換コード
JavaScript (Node.js / ブラウザ)
// 現在のタイムスタンプ(ミリ秒)を取得
const timestampMs = Date.now();
// 経過秒数(Unixタイムスタンプ)に変換
const timestampSec = Math.floor(Date.now() / 1000);
// タイムスタンプ(秒)から Date オブジェクトを復元
const date = new Date(timestampSec * 1000);
console.log(date.toISOString());
Python
import time
from datetime import datetime, timezone
# 現在のUnixタイムスタンプ(秒)
sec = int(time.time())
# 日時文字列に変換 (UTC)
dt = datetime.fromtimestamp(sec, tz=timezone.utc)
print(dt.isoformat())
PostgreSQL / MySQL
-- PostgreSQL: 現在のUnixタイムスタンプを取得
SELECT EXTRACT(EPOCH FROM NOW());
-- MySQL: 現在のUnixタイムスタンプを取得
SELECT UNIX_TIMESTAMP();