てもとツール
ガイド

2038年問題とは|日本時間で何時に起きて何が困るか

2038年問題は、時刻を「1970年からの秒数」として32ビットの整数で数える仕組みが、2038年1月19日12時14分7秒(日本時間)に上限へ届く問題です。上限を超えると何が起きるか、2038年より前に出てくる場面、64ビットなら済むのかを、秒数の計算でまとめました。

公開読了目安 約5分

この記事の要点

  • 2038年問題は、1970年からの秒数を32ビットの符号付き整数で数える仕組みの上限の問題
  • 上限の2,147,483,647秒は、日本時間で2038年1月19日(火)12時14分7秒
  • 負の側に回る作りでは、1秒後に1901年12月14日5時45分52秒に見える
  • 32ビットで数える仕組みでは、期限や予定のような先の日時が2038年より前に上限に当たる
  • 64ビットで数える仕組みでも、32ビットの欄に保存するデータは別に確かめる
目次

2038年問題は、時刻を「1970年1月1日からの秒数」として32ビットの符号付き整数で数える仕組みが、上限に届く問題です。 上限に届くのは、日本時間で2038年1月19日(火)12時14分7秒です。

その1秒後には、数がそれ以上大きくなれません。 負の側に回る作りでは、日時が1901年12月に戻って見えます。

この記事では、上限の時刻がどこから来るのかを秒数で確かめます。 2038年より前に問題が出てくる場面と、64ビットにすれば済むのかもまとめました。

1970年からの秒数で、時刻を数えている

コンピュータには、時刻を「1970年1月1日0時(UTC)から何秒たったか」の1つの数で持つ仕組みがあります。 この数をUNIX時間(UNIXタイムスタンプ)と呼びます。

たとえば日本時間の2000年1月1日9時は、946,684,800です。 秒数と日時の読み替え方は、UNIXタイムスタンプを日時に変換する使い方にまとめています。

問題になるのは、この数を入れておく箱の大きさです。 32ビットの「符号付き整数」という箱は、負の数も入れるために半分を負の側に使います。

そのため、入れられる最大の数は2の31乗から1を引いた2,147,483,647です。 秒にすると約68年分で、1970年に足すと2038年になります。

上限の時刻を、日本時間で確かめる

上限の秒数を日時に直すと、次のとおりです。

  • UTC: 2038年1月19日 3時14分7秒
  • 日本時間: 2038年1月19日(火)12時14分7秒

日本時間はUTCより9時間進んでいるので、昼の12時過ぎになります。

上限を超えると、1901年に戻って見える

上限の次の1秒は、32ビットの符号付き整数では表せません。 そのまま足し算を続けると、値はいちばん小さい負の数の −2,147,483,648 に回ります。

負の秒数は、1970年より前の日時として読まれます。 −2,147,483,648秒は、日本時間で1901年12月14日5時45分52秒です。

つまり、2038年の昼を過ぎた瞬間に、時計が136年あまり前へ飛んだように見えます。 ただし実際にどう振る舞うかは作りしだいで、止まる・エラーになる仕組みもあります。

2038年より前に出てくる場面

2038年問題は、2038年1月19日が来るまで関係ない、とは限りません。 32ビットで数える仕組みでは、先の日時を扱う処理が、今日の時点で上限に当たります。

たとえば、次のような値です。

  • 何年も先に切れる有効期限(会員証・証明書・保証の期限など)
  • 先の日付を入れる予定や、くり返しの終わりの日
  • 「今日から20年後」のように、今日に年数を足して出す日付

2026年10月に20年を足すと、2046年10月で上限の外です。 32ビットで数える部分が途中にあると、その日時は保存や計算の段階でつまずきます。

64ビットにすれば済むのか

秒数を64ビットの符号付き整数で数えれば、上限は約2,923億年先になります。 OSの共通の規格の最新版は、時刻を64ビット以上で持つよう求めています。 それでも、既定では32ビットのまま動くシステムが残っています。

また、64ビットで計算するパソコンでも、保存する欄が32ビットなら同じ上限に当たります。

ファイルの形式やデータベースの列、機器どうしの通信の決まりなどは、計算する機械とは別に箱の大きさを持っています。 2038年以降の日時を扱えるかは、日時を通す部分ごとに確かめる必要があります。

符号なしなら2106年まで

32ビットでも、負の数を入れない「符号なし整数」の箱なら、上限は約2倍の4,294,967,295です。 日本時間では、2106年2月7日15時28分15秒になります。

そのかわり、1970年より前の日時は表せません。 上限を延ばすか、昔の日時を残すかの取り合いになります。

手元で上限の前後を確かめる

UNIXタイムスタンプ変換ツールには「2038年問題」のボタンがあり、押すと上限の 2147483647 が入ります。 日本時間の欄で、2038年1月19日12時14分7秒と読めます。

このツールは32ビットの箱を使わないので、2147483648 を入れても2038年の続きの時刻が出ます。 32ビットの箱で回った後の値を見たいときは、-2147483648 を入れると1901年12月14日が出ます。 スマホの数字のキーボードには「-」が無いことがあるので、そのときはこの数をコピーして貼り付けてください。

補足: 開発者の方へ

MySQL の公式マニュアルでは、TIMESTAMP 型の範囲は 2038-01-19 03:14:07(UTC)までです。 同じ MySQL でも、DATETIME 型の範囲は9999年までです。

C の time_t の幅について、Linux のマニュアルは POSIX.1-2024 が64ビット以上を求めていると説明しています。 同じページには、既定で32ビットのままのシステムもあると書かれています。 _TIME_BITS で幅を選べるアーキテクチャもあります。

関連記事

参考・出典

本記事は上記の公的機関・公式情報源を参考にしています。最新の情報は各リンク先をご確認ください。

あわせて読みたい

同じテーマ・関連ツールの記事です。