HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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);