Y2K38問題 — Unixタイムスタンプのオーバーフロー解説

32ビットUnixタイムスタンプがオーバーフローする2038年問題について学びます。影響を受けるシステム、正確なオーバーフロー時刻、準備方法を理解します。

Fundamentals

詳細な説明

Y2K38問題

2038年問題(Y2K38バグまたはエポカリプスとも呼ばれる)は、Unixエポックタイムスタンプが符号付き32ビット整数の最大値をオーバーフローするコンピューティングの制限です。正確な時刻:

2038年1月19日 03:14:07 UTC

その瞬間、タイムスタンプ値は2,147,483,647(2^31 - 1)に達します。1秒後、-2,147,483,648にラップアラウンドし、システムはこれを1901年12月13日と解釈します。

なぜこれが起こるのか?

初期のUnixシステムは時間をtime_t型として保存し、これは符号付き32ビット整数でした。符号付き32ビット整数は-2,147,483,648から2,147,483,647までの値を保持できます。エポック0(1970年1月1日)から始めると、各方向に約68年の範囲 — 1901年12月から2038年1月まで — が得られます。

影響を受けるシステム

  • 組み込みシステム(IoTデバイス、産業用コントローラ、車載ECU)
  • レガシーデータベースの32ビット整数タイムスタンプ列
  • 古いファイルシステム(ext3タイムスタンプ、FAT32)
  • パッチされていない32ビットLinuxシステム

安全なシステム

  • 64ビットオペレーティングシステム(最新のLinux、macOS、Windows)
  • JavaScript(内部的に64ビット浮動小数点を使用)
  • Python 3(任意精度整数)
  • Javalongは64ビット)

修正方法

解決策は簡単です:タイムスタンプに64ビット整数を使用します。符号付き64ビット整数は約2920億年先の日付まで表現でき、実用的な懸念をはるかに超えています。

ユースケース

32ビットタイムスタンプを使用している可能性のあるレガシーシステム、組み込みデバイス、またはデータベースを監査する際にこの情報を使用してください。システムプログラミングの面接でもよく聞かれるトピックです。

試してみる — Epoch Countdown

フルツールを開く