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) として認識されてシステムが誤作動・クラッシュします。

現代の回避策

  1. 64bit整数(int64_t / BIGINT)への移行: 64bitでの上限は約2922億年後のため問題は解消されます。
  2. 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();