Javaで開発されたアプリケーションの抱える時限爆弾の一つ。
Javaの日時管理は、1970年1月1日00:00:00を基準(これをThe Epochという)とし、その時間からの経過ミリ秒で扱っている。なお、この経過秒数には、一般的には閏秒は含めていない。
この経過ミリ秒数は64ビットで表現されるが、符号を考慮すると有効桁は63ビットしかない。そのため「1970年1月1日 00:00:00 + 0x7fffffffffffffffミリ秒より後が表現できない」という問題を抱える事となった。
即ち、西暦2億9247万1208年頃(1年365日とし閏年を無いことにした単純計算の場合)にカウンターはオーバーフローし、時刻は1970年に戻ってしまうと考えられる。これが2億9千万年問題である。
2000年問題が騒がれた頃、Sun Microsystemsは、Javaには2000年問題は無いと表明していた。
確かに、Javaに2000年問題は存在しないが、これとは別に2億9千万年問題が存在するのである。
Javaは、2000年問題や、Cのtime_tにある2038年問題をJavaで起こさないよう、日付時刻型の仕様を練り上げたと考えられる。
かくしてJavaの仕様は確かに次の約2億9千万年間の年号表記を保証する。その時には誰も現在のプログラムは使用されていない、のみならず人類も既にいないかも知れない、という前提がある。しかしこれは全く誤った理論であり、現在の2000年問題へと繋がる怠惰なプログラミングの習慣であるといえる。
西暦2億9千万年には誰もが現在のプログラムの消滅を仮定しているが、2000年問題の発生の歴史を見れば、その考え方が誤っていることは自明である。
2000年問題を見据えてJavaは対策を講じはしたが、しかしその解決法は、単に問題を2億9千万年後に先送りしたに過ぎなかったのである。
問題発生は、約2億9千万年後に迫っている。このため、今から心配で夜も眠れない人がいても不思議ではない。