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