BeginnerEngineerBlog
中の人
中の人

【php】DateTimeクラスで過去か未来か判定する方法

公開: 2022-08-18 16:57
更新: 2023-04-09 00:10
1366
php DateTime diff invert DateInterval
フォームのバリデーションなんかでよく、開始日時と終了日時の整合性が合っているかというのあると思いますが、簡単に整合性を判定する方法がなかなかヒットしなかったのでメモとして紹介します。

こんにちは!

中の人です。

説明文にもあるように、日付フォームのバリデーションで

「開始日時」「終了日時」を比べて、終了日時の方が開始日時より過去の日付になっていないか

というチェックをすること多いと思います。

この

・過去か未来か

をDateTimeクラスを使用して判定する簡単な方法をメモ程度に紹介します!


過去か未来か判定する方法


過去、未来が正しい場合


<?php

$from = new \DateTime('2022-12-12 00:00:00');
$to = new \DateTime('2022-12-13 00:00:00');

var_dump($from->diff($to)->invert);

この実行結果は

int(0)

になります。

過去、未来が間違っている場合


<?php

$from = new \DateTime('2022-12-13 00:00:00');
$to = new \DateTime('2022-12-12 00:00:00');

var_dump($from->diff($to)->invert);

この実行結果は

int(1)

になります。

過去が未来より未来の場合、1が返ってきます。

へー(゚∀゚ )

過去、未来が同じ場合


ちなみに、

<?php

$from = new \DateTime('2022-12-12 00:00:01');
$to = new \DateTime('2022-12-12 00:00:01');

var_dump($from->diff($to)->invert);

同じ日付時間の場合は

int(0)

が返ってきます。
ホー(゚∀゚ )

diff関数、DateIntervalクラス


diff関数


DateTimeクラスのdiff関数は、DateTimeInterfaceが実装されたクラス同士を比較してくれる関数です。
で、

var_dump($from->diff($to));

diffの返り値は

object(DateInterval)#3 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(1)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(1)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

こんなのが返ります。


DateIntervalクラス


上記返り値を見てわかる通り、diff関数の返り値はDateIntervalクラスのオブジェクトです。

その中のプロパティの

  ["invert"]=>
  int(0)

これが過去か未来かを判定してくれています。


すごい簡単!


終わりに


時間の比較方法とかって毎回ネット記事漁って調べてるのですが、この「過去」か「未来」かのみ判定する方法で簡単な方法っていうのがあまりヒットしなかったんですよね。
(DateTimeをformatで文字列にしてstrtotimeで比較など)

正直、diffの返り値の中でなんか簡単に判定できる値ないかなーってデバッグしてたら、なんか1になったり0になったりするやつ見つけて、ドキュメント調べたらそういう趣旨の内容が書いてあったんですよね。
へー(゚∀゚ ) < ソンナンシランワ

DateTimeインスタンス同士を比較演算子で比較するとかもありますが、すごいなんとなくですがちゃんと比較されるのかなぁって気もしたのでまぁ、簡単に比較できる選択肢の一つとして知っておいて良いんじゃないでしょうか?

ということで

誰かの参考になれば幸いです!
0
0
0
0
通信エラーが発生しました。
似たような記事