2038 年問題(Y2K38)を解説
2038 年 1 月 19 日 03:14:07 UTC に、Unix タイムスタンプ 2,147,483,647 — 32 ビット符号付き整数の最大値 — がオーバーフローします。それが何を意味するか、どのシステムが影響を受けるか、なぜ現代のコードの多くがすでに安全かを解説します。
2038 年問題とは?
Unix タイムスタンプは伝統的に、1970 年 1 月 1 日 00:00:00 UTC からの秒数を数える 32 ビット符号付き整数として保存されます。32 ビット符号付き整数の最大値は 2,147,483,647 で、これは 2038 年 1 月 19 日 03:14:07 UTC に相当します。その 1 秒後、整数は -2,147,483,648 にオーバーフローします。Unix タイムスタンプとして解釈すると、この負の値は 1901 年 12 月 13 日に相当し、影響を受けるシステムを約 137 年前へ送り戻します。
オーバーフローの値
- 2^31 − 1 = 2,147,483,647(32 ビット符号付き整数の最大値)
- 2,147,483,647 を日付に = 2038 年 1 月 19 日 03:14:07 UTC
- 2,147,483,647 + 1 は −2,147,483,648 にオーバーフロー(32 ビットで最も小さい値)
- −2,147,483,648 を日付に = 1901 年 12 月 13 日 20:45:52 UTC
どのシステムが危険か?
この問題は、タイムスタンプを 32 ビット符号付き整数で保存するシステムに影響します:
- 32 ビットの time_t を使う組み込みシステムやマイコン
- 32 ビット向けにコンパイルされ、タイムスタンプに time_t や int を使うレガシーな C/C++ コード
- まだ稼働中の 32 ビットハードウェア上の古い Linux カーネル(5.6 より前)
- MySQL の TIMESTAMP 列 — 2038-01-19 までに制限。代わりに DATETIME を使う
- タイムスタンプを 32 ビット値で符号化する一部のネットワークプロトコルやファイル形式
- 数十年の寿命を持つ産業用制御システムや IoT 機器のファームウェア
どのシステムが安全か?
現代のコードとインフラのほとんどはすでに影響を受けません:
- あらゆる 64 ビット OS — Linux(glibc 2.34+ は 32 ビットハードウェアも修正)、macOS、Windows
- Python — タイムスタンプは 64 ビット浮動小数点を使い、西暦 2 億 9200 万年をはるかに超えて安全
- JavaScript — Date は 64 ビット IEEE 754 浮動小数点を使い、西暦 275,760 年まで安全
- Go と Rust — 内部で int64 を使い、数十億年安全
- Java — java.time.Instant は long(64 ビット)を使い、西暦約 2 億 9200 万年まで安全
- PostgreSQL TIMESTAMP — 2038 年以降の日付も正しく保存
- MySQL DATETIME — 範囲は 1000-01-01〜9999-12-31 で影響なし
2038 年問題 FAQ
- 2038 年問題とは?
- 2038 年問題(Y2K38)は、Unix タイムスタンプの保存に 32 ビット符号付き整数を使うシステムが、2038 年 1 月 19 日 03:14:07 UTC にオーバーフローするバグです。32 ビット符号付き整数の最大値は 2,147,483,647 です。その 1 秒後、整数は -2,147,483,648 に折り返し、これは 1901 年 12 月 13 日に相当します。
- 2038 年 1 月 19 日の Unix タイムスタンプは?
- 2038 年 1 月 19 日 03:14:07 UTC の Unix タイムスタンプは 2,147,483,647 で、32 ビット符号付き整数の最大値(2^31 - 1)です。32 ビットシステムで 2038 年オーバーフローが起こる正確な瞬間です。
- Y2K38 は Y2K と同じ?
- いいえ。Y2K(2000 年問題)は年を 2 桁で保存するプログラムが原因でした。Y2K38 は Unix タイムスタンプを 32 ビット符号付き整数で保存し、2038 年にオーバーフローすることが原因です。原因も影響を受けるシステムも異なります。
- 2038 年にインターネットは壊れる?
- 大きくは壊れないでしょう。インターネットインフラの大半はすでに 64 ビットシステムへ移行済みです。リスクは組み込みシステム、古い IoT 機器、数十年更新されていないソフトウェアに集中します。現代の OS・言語・データベースはすでに安全です。