2 月 14 日に UNIX time(1970年1月1日からの秒数)が 1234567890 秒になるということを耳にしましたので、C で time_t を使って現在時刻と 1234567890秒 が正確にはいつになるのかプログラムを書いてみました。
結果は
Wed, 11 Feb 2009 00:09:35 +0900 Sat, 14 Feb 2009 08:31:30 +0900 Tue, 19 Jan 2038 12:14:07 +0900
ということで 2 月 14 日の午前 8 時 31 分 30 秒がその時刻のようです。3 つめのは time_t がオーバーフローする直前の時刻です。time_t のサイズは処理系依存のため実行環境によって結果は変わる可能性がありますが、私が実行した環境では time_t の型定義は以下のように int 型でした。int は 4 バイトの環境ですのでばっちり 2038 年問題に出くわす処理系だということがわかります。
/usr/include/time.h:typedef __time_t time_t; /usr/include/machine/_types.h:typedef __int32_t __time_t; /usr/include/machine/_types.h:typedef int __int32_t;
一方で 64 bit の long 型で time_t が定義されているような環境では 2038 年問題は起こらずに 292277026596 年問題になるそうです。なんだそりゃって感じです。気をつけなくてはいけないのは、time_t が 64 bit であっても、それを利用しているライブラリとかシステムが 32bit の変数で time_t の値を受けていたら結局 2038 年問題は起こるんですよね。












最近のコメント