64ビット関係のPHP7の日時を扱う関数、クラスが64ビットの unix time を何の問題もなく処理できるか、ふと気になったのでこちらを参考に、試してみた。
(1) strtotime は32ビットを超える日時は、入力される年が4桁までなら正しく unix time を出力できるが、5桁以上は正しく出力できない。
(例)
var_dump(strtotime('9999-12-23'));
(結果)int 253401490800
var_dump(strtotime('12345-12-23'));
(結果)int 1135308840
(2) strftime は32ビットを超える unix time は、結果の年が4桁までなら正しく変換できるが、5桁以上は変換できない。
(例)
print strftime("%Y-%m-%d %w %H:%M:%S", 253401490800);
(結果)9999-12-23 4 00:00:00
print strftime("%Y-%m-%d %w %H:%M:%S", 2534014908000);
(結果)
(3) date は、32 ビットを超える unix time を正しく日時に変換できる。
(例)
print date("Y-m-d H:i:s", 2534014908000);
(結果)82269-09-26 15:00:00
(4) DateTime クラスは、32ビットを超える unix time を正しく日時に変換できるが、日時から unix time への変換は年が5桁以上になる場合は正しく変換できない。
(例)
$d = new DateTime();
$d->setTimestamp(2534014908000);
echo $d->format('Y-m-d\TH:i:s u v');
(結果)82269-09-26T15:00:00 000000 000
$d = new DateTime('12345-12-23');
print $d->getTimestamp();
(結果)1135308840
上のような結果になった。
とりあえず、西暦9999年までは、どの関数、クラスを使っても問題ないようだが、年が5桁以上になると正常動作しないものがちらほらあるので、すっきりとはしない。PHP7より前の Windows のPHPでは、 int のサイズはプラットフォームに依らず32ビット固定だったが、PHP7でせっかく64ビットにも対応したのだから、標準関数、クラスも完璧に動作するようにコードを書いて欲しかった。