【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系のオブジェクトを使うのが一般的ですので、今はあまりstrtotime関数は使われていないかと思いますが、長く続いているシステムだと残っているかもしれません。

カテゴリーPHP

コメントを残す

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