ど素人から毛を生やす。<延>

MySQLから取り出した「日付データがあるとき」の条件分岐を、できるだけ最短の記述で行いたい。

Web > PHP 2018年12月28日(最終更新:5年前)

2018年12月28日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

PHPで日付データがあるとき、の条件分岐をしたい。

このとき、厳密な日付フォーマットチェックを行いたいのであれば、DateTimeクラスを用いるのが妥当です。
参考サイト:
[Qitta]【PHP】DateTimeクラスでcheckdate()より汎用性のある日付チェックを行う
[SOFTELメモ]【php】DateTimeクラスで日付の表示の補正をおこなう

しかし、今回はMySQLからデータを取り出して使いたい場合です。
厳密なフォーマットチェックは入力時に行うべきことであって、この場合はもっとシンプルにできるはず。

そして問題となるのはMySQLにて、DATETIMEカラムをNOT NULLにすると、
デフォルト値が「0000-00-00 00:00:00」になるということです。

さて、どうすれば最短かつ明瞭な条件分岐になるか。

strtotime()を利用

if(strtotime($date) > 0) echo "日付があるよ"; else echo "日付が無いよ";

ああ、これでいいのか。

「0000-00-00 00:00:00」のとき、環境次第でstrtotime()の返す値が「-62170016400」だったり「false」だったりするという素敵な話がありますが、falseは0なので、「0より大きい」という条件ならどちらもクリアできるわけです。
ついでにいうなら、空白や他の文字など、日付に変換できないものも弾いてくれるので尚良し。

しかし、1970年1月1日以降の日付でないとfalseになってしまうので、汎用性が高いかと言われると、微妙。

文字列として比較

if($date > "0000-00-00 00:00:00") echo "日付があるよ"; else echo "日付が無いよ";

別解。文字列型として比較するパターン。
記述的にはちょっと面倒。しかし処理的にはほぼ最短かつ意外とカバー範囲が広い。

"0000-00-00 00:00:00" は、当然false。
"0000-00-00" もfalseなので、カラムがDATE型かDATETIME型か区別する必要なし。
空白もfalse。

うん、要点を満たしています。
上の解の問題点、1970年より前がfalseとなることもない。西暦1年から許容。

難点は空白or想定のフォーマット以外が入ったときにtrueとなることだが、DBから抜いたそのままのデータを対象とするならその配慮も不要。

泥臭いが、案外これが最適解かもしれない。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (1)