2038年問題

Linux を初めとする UNIX 互換システムは, 時刻を32ビット符号つき整数で表しているので, 2000年問題ならぬ2038年問題があります。

次のプログラムを動かしてみましょう。

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

int main()
{
    time_t t;

    t = 0;
    printf("0x%08x: %s", (unsigned)t, ctime(&t));
    t = time(NULL);
    printf("0x%08x: %s", (unsigned)t, ctime(&t));
    t = 0x7fffffff;
    printf("0x%08x: %s", (unsigned)t, ctime(&t));
    t = 0x80000000;
    printf("0x%08x: %s", (unsigned)t, ctime(&t));
    t = 0xffffffff;
    printf("0x%08x: %s", (unsigned)t, ctime(&t));
    return 0;
}

結果は次のようになります。

0x00000000: Thu Jan  1 09:00:00 1970
0x36eb7bbc: Sun Mar 14 18:05:00 1999
0x7fffffff: Tue Jan 19 12:14:07 2038
0x80000000: Sat Dec 14 05:45:52 1901
0xffffffff: Thu Jan  1 08:59:59 1970

1行目は UNIX 暦元年の元旦,1970年の0時(日本時間では9時)です。 2行目は現在時刻です。 32ビット符号つき整数最大の値 0x7fffffff では2038年1月19日ですが, 0x80000000 では負の値になってしまい, 1901年に逆戻します。

同じ32ビットでも符号なし整数にすればさらに68年間は大丈夫です。 また,64ビットにすれば 1011 年ぐらいは大丈夫です。


リンクはご自由にどうぞ。

松阪大学 奥村晴彦 okumura@matsusaka-u.ac.jp

Last modified: Sun Mar 14 21:36:19 1999