DateTimeクラスのdiffメソッドの罠
突然ですが、以下のコードの出力結果はどうなると思いますか?ちなみに「invert」というのは、結果が負の場合に「1」それ以外の場合に「0」になるプロパティ。
<?php date_default_timezone_set("Asia/Tokyo"); $dt1 = new DateTime("2017-12-01"); $dt2 = new DateTime("2017-11-30"); $diff1 = $dt1->diff($dt2); $diff2 = date_diff($dt1, $dt2); var_dump($diff1->invert, $diff2->invert);
$dt1
の方が未来なので、直観的にはint(0)
になるだろうと思うところだが・・
ドキュメントは以下だけど・・・
明記されていないが、$dt2 - $dt1
の結果になる。すなわち、負になるので、int(1)
が出力される。
これは罠過ぎるだろう!!!
なので、DateTimeオブジェクト同士の日時の前後を比較したいだけなら、(PHP 5.2.2以降になるが)比較演算子で比較するようにした方が安全かも。
<?php date_default_timezone_set("Asia/Tokyo"); $dt1 = new DateTime("2017-12-01"); $dt2 = new DateTime("2017-11-30"); var_dump($dt1 == $dt2); var_dump($dt1 < $dt2); var_dump($dt1 <= $dt2); var_dump($dt1 > $dt2); var_dump($dt1 >= $dt2);