hnwの日記

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 "

合わせて読みたい

1999/04/01に出たジョークRFCです。真面目な議論をしているのが面白いと思います。

まとめ

2038年問題の次はY10K問題が来ます!業界的に特需間違いなしですね!