みなさんは「2000年問題(Y2K問題)」をご存じでしょうか。
「西暦の下2桁しか保存していなかったため、2000年になると1900年と誤認識してしまう」問題で、
当時は世界的に大きな話題になりました。
2000年(当時)の自分はガキンチョだったので全く知らなかったです。

実は、それと似たような問題が2038年に発生する可能性があるのです。
その名も 「2038年問題(Year 2038 Problem)」。

この問題が発生すると一部のコンピューターシステムが「1901年」に戻るという奇妙な現象が起こるかもしれません。
今回はこの2038年問題について「なぜ起こるのか?どんな影響があるのか?解決策は?」を簡単に解説していきます。

2038年問題の原因は「時間の管理方式」

まず2038年問題の根本的な原因はUNIX系OSやC言語が使う「時間の管理方式」にあります。
ほとんどのコンピューターは、時刻を「1970年1月1日 00:00:00(UTC)からの経過秒数」で管理しています。
この方式は「UNIX時間(エポックタイム)」と呼ばれ、time_tという変数(整数型)に保存されています。

32bitのtime_tの限界

time_tは32bitの符号付き整数(-2,147,483,648 ~ 2,147,483,647)で管理されています。

数値時刻
01970年1月1日 00:00:00 UTC
1,000,000,0002001年9月9日 01:46:40 UTC
2,147,483,6472038年1月19日 03:14:07 UTC ← ここが限界!

2038年1月19日 03:14:07 UTCでtime_tの最大値に到達!
その次の1秒 (2,147,483,648秒) に入ると…
オーバーフローが発生し、-2,147,483,648 に戻る(=1901年12月13日 20:45:52 UTC にリセット)

C言語お試しコード

#include <stdio.h>
#include <time.h>

int main() {
    time_t t = 2147483647;  // 2038年1月19日 03:14:07 UTC
    printf("Before overflow: %s", ctime(&t));

    t += 1;  // 1秒後
    printf("After overflow: %s", ctime(&t));  // 1901年になる!?

    return 0;

実行すると時刻が1901年に戻るのが確認できるかと思います。
これが「2038年問題」の正体です。

実際にどうなるかはYouTubeで上げてくださっている方がいらっしゃいましたのでこちらでご確認ください。

実行出来る環境をお持ちの方は32bit環境でCコンパイラを使って試してみてください。
もしどうしても試してみたい方はVirtualBox + 32bitLinuxの組み合わせが手軽かと思います。
(Web上で実際に動かして確認出来るようなサイトがないか調べてみましたが見つからず…)

2038年問題の影響

ではこの問題が発生するとどんな影響があるのでしょうか?

影響を受ける可能性があるもの

  • 古いUNIX/Linuxシステム(32bit版)
  • 古いC言語で作られたプログラム
  • ATM、交通システム、医療機器、工場の制御装置などの「組み込みシステム」
  • 金融システム(ローンや保険の長期契約に影響)
  • 一部のファイルシステム(ext3など)

特に長期間運用される「組み込みシステム」が問題視されており、
「ソフトウェアアップデートがされていない銀行のATM」や「古い工場の制御システム」などは、
突然1901年に巻き戻って誤作動を起こす可能性があります。

影響が少ないもの

  • 64bitシステム(ほとんどの最新PC/サーバー)
  • クラウドサービス(AWS/Google Cloud/Azureなど)
  • 最新のOS/プログラミング言語(time_tが64bit化されている)

2038年問題の解決策

「この問題をどうやって解決するか」についてですが、主な解決策は以下の3つです。

①64bit化する

・64bitのtime_tを使えばほぼ無限(2900億年以上)時間を管理可能です。
 また、最新のLinuxカーネルやWindows/macOSはすでに64bit化されているので影響は少ないかと思います。
 ただし古いシステム(特に組み込み機器)は要注意です。

②符号なし整数(uint32_t)を使う

・time_tを符号なし(uint32_t)にすれば2106年まで延長できます。
 ただしこれは一時的な解決策でしかありません。

③ソフトウェアのアップデート

・古い32bitシステムを使っている場合、OSやプログラムを最新のものにアップデートすることが最善策です。

まとめ

項目詳細
発生日時2038年1月19日 03:14:07 UTC
原因32bit time_t のオーバーフロー
影響一部のシステムで「1901年」に戻る
影響範囲古いUNIX/Linux、C言語のプログラム、
ATMや医療機器などの組み込みシステム
解決策64bit化、ソフトウェアのアップデート

最後に

2038年問題は最新のPCやスマホではほとんど影響ないですが、
古いシステムや組み込み機器では深刻な影響が出る可能性があります。
2000年問題のように事前の対策がしっかり行われれば大きな混乱は防げるはずです。
でも、もし対策が遅れると…2038年に「突然1901年に戻る世界」が訪れるかも!?
あなたの会社やシステムもこの問題の影響を受けるかもしれませんよ…?