【PHP】ミリ秒を含む秒数まで同じ日付を比較すると意図しないものになった

結果を知ってしまえば、大した話ではないのですが…

比較に、 strtotime関数を使ってませんか?

strtotime (PHP公式)

公式にもある通り、「英文形式の日付を Unix タイムスタンプに変換する」のがstrtotime関数です。

Unixタイムスタンプは、「1970 年 1 月 1 日 00:00:00 UTC からの経過数」なので、までしか扱いません。
ですので、以下のような場合は、falseになってしまいます。

$a = '2022-09-01 15:52:04.336';
$b = '2022-09-01 15:52:04.975';

// どちらも 1662015124 で同じ値
if (strtotime($a) < strtotime($b)) {
    var_dump(true);
} else {
    // こっちに来る
    var_dump(false); 
}

では、ミリ秒で比較したいときはどうすればいいかですが、
DateTimeImmutableもしくは DateTime オブジェクトを使うと良いと思います。

$a = '2022-09-01 15:52:04.336';
$b = '2022-09-01 15:52:04.975';

try {
    $aObject = new DateTimeImmutable($a, new DateTimeZone('Asia/Tokyo'));
    $bObject = new DateTimeImmutable($b, new DateTimeZone('Asia/Tokyo'));

    if ($aObject < $bObject) {
        // こっちに来る
        var_dump(true);
    } else {
        var_dump(false);
    }

} catch (Exception $e) {
    // 例外処理
}

それぞれ、DateTimeImmutableオブジェクトを作って比較すればいいだけいいので個人的にはこちらの方が見やすいですね。

今は日付操作はDateTime系のオブジェクトを使うのが一般的ですので、今はあまり使われていないかと思いますが、長く続いているシステムだと残っているかもしれません。

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です