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

--------------------------------------------------------