hnwの日記

Unknown曜日


(2016/04/01追記) 本バグはPHP 5.5.20以降、およびPHP 5.6.4以降で修正されています。


64bit環境のPHPで過去の曜日を調べてみたら「知らんよ」って言われました。

<?php
var_dump(date("l Y m d",mktime(0,0,0,10,1,-7))); //string(19) "Unknown -0007 10 01"


紀元前8年10月1日はUnknown曜日ってことですね!(注:西暦1年の前年は紀元前1年です)


というのは冗談で、PHPのバグです。ソースコードを確認すると西暦に対して%演算子を適用しており、負の年号を与えた場合に曜日を間違えるようです。負の数の剰余が負になることが想定外のコードに見えました。


余談ですが、エイプリルフールってアレなバグを書くにはナイスな日ですね。追試環境を持ってない人だと「またPHPか」なんてうかつにコメントできないですからね。


(以下追記:2010-04-01 15:30)id:shimookaさんから、まさかのマジレスが来てたので追試してみました。

<?php
$datetime = new DateTime;
$datetime->setDate(-7,10,1);
$datetime->setTime(0,0,0);
// string(36) "Unknown, 01 Oct -0007 00:00:00 +0900"
var_dump($datetime->format(DateTime::RFC2822));


確かに32bit環境でも再現しました!DateTimeって通常の日付関数とは別の実装だと思い込んでいて敬遠していたんですが、同じ処理を利用しているみたいですね。これからは安心して使います!