2038年問題
■Javaの場合
java.util.Dateクラスの getTime() メソッドは、1970/1/1 00:00:00(UTC)からの通しミリ秒数(つまり time_t * 1000)を返す。ただし、戻り値の型はlong(符号付き64bit)なので、このメソッド自体に2038年問題はない。
しかし、次のようなコードを書くと問題になる。
■Javaソース
--------------------------------------------------------
Date now = new Date();
long gettime;
int sec;
//gettime = now.getTime()した想定
gettime = (long)0x7fffffff * 1000; //単位はミリ秒
sec = (int)(gettime / 1000); //秒変換しintで管理
now.setTime((long)sec * 1000); //ミリ秒に戻してset
System.out.println(now);
//gettime = now.getTime()した想定
gettime = (long)0x80000000 * 1000; //単位はミリ秒
sec = (int)(gettime / 1000); //秒変換しintで管理
now.setTime((long)sec * 1000); //ミリ秒に戻してset
System.out.println(now);
--------------------------------------------------------
■実行結果
--------------------------------------------------------
Tue Jan 19 12:14:07 JST 2038 ・・・1秒後は1901年に戻る
Sat Dec 14 05:45:52 JST 1901
--------------------------------------------------------