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