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 で幅を選べるアーキテクチャもあります。
関連記事
- UNIXタイムスタンプを日時に変換する使い方(秒数と日時の読み替え)
- UTCと日本時間の違い(9時間の時差の足し引き)
- 2つの日付の間の日数を数える(先の日付までの日数)
- JWTのexpの読み方|有効期限を日本時間で確かめる手順(秒数で書いた有効期限の読み方)
参考・出典
- The DATE, DATETIME, and TIMESTAMP Types(MySQL 8.4 Reference Manual) — Oracle (2026-10-12 閲覧)
- time_t(3type)(Linux man-pages) — The Linux man-pages project (2026-10-12 閲覧)
本記事は上記の公的機関・公式情報源を参考にしています。最新の情報は各リンク先をご確認ください。
あわせて読みたい
同じテーマ・関連ツールの記事です。