PHPのY10K問題
PHPは他の言語と同様に、時刻を扱う際にunix epochからの経過秒数(いわゆるunix time)を利用しています。PHP5.2.6以降では、64bit環境であればunix timeも64bitに拡張されています。これで2038年問題も過去のものになるというわけです。
一方、unix timeが64bitに拡張されたことでカオスな結果になることがあるようです。64bit環境のPHP5.2.11で気づいた点を紹介します。
strtotimeが西暦10K年以降に対応していない
<?php var_dump(strtotime("9999-12-31 23:59:59")); // int(253402268399) var_dump(strtotime("+10000-01-01 00:00:00")); //int(946648800)
ISO8601的に+10000という書き方は正しいはずなのですが、理解してくれません。随分小さい値を返しています。
date関数の特定のフォーマットが西暦10K年以降に対応していない
<?php var_dump(date("r", 200000000000)); // string(31) "Wed, 02 Oct 8307 04:33:20 +0900" var_dump(date("r", 300000000000)); // string(31) "Tue, 15 Aug 11476 14:20:00 +090"
西暦10K年を超えると、+090という不思議なタイムゾーンになります。100M年を超えるとタイムゾーンが見えなくなって一見正しくなります。
<?php var_dump(date("r", 4000000000000000)); // string(31) "Tue, 11 Jan 126756924 16:06:40 "
まとめ
2038年問題の次はY10K問題が来ます!業界的に特需間違いなしですね!