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(任意精度整数)
- Java(
longは64ビット)
修正方法
解決策は簡単です:タイムスタンプに64ビット整数を使用します。符号付き64ビット整数は約2920億年先の日付まで表現でき、実用的な懸念をはるかに超えています。
ユースケース
32ビットタイムスタンプを使用している可能性のあるレガシーシステム、組み込みデバイス、またはデータベースを監査する際にこの情報を使用してください。システムプログラミングの面接でもよく聞かれるトピックです。