このような<input type=”time”>を指定したフォームからの入力値など、PHPで時刻をバリデーションしたいときに使える方法を紹介します。
チェック方法
コード
/**
* 時刻のバリデーション
*
* @param string $time 時刻の文字列(フォーマットは"H:i")
* @return bool 有効/無効
*/
function validTime(string $time): bool
{
$timeObj = DateTime::createFromFormat('H:i', $time);
return $timeObj && $timeObj->format('H:i') === $time;
}
validTime("12:34"); // true
validTime("43:21"); // false
解説
やっていることとしては、以下の2つです。
- 時刻の文字列をDateTime型のオブジェクトに変換します。
- DateTime型のオブジェクトに変換できたこと、およびDateTime型のオブジェクトから文字列に戻したときに元の文字列に戻ることを確認します。
それぞれ関数の1行目と2行目に対応しています。
1行目
$timeObj = DateTime::createFromFormat('H:i', $time);
createFromFormat()は、文字列からDateTimeオブジェクトを生成するメソッドです。
1つ目の引数が形式、2つ目の引数が対象の文字列です。
第1引数を書き換えることで、他の形式にも応用可能です。
フォーマットはこちらの公式ページをご確認ください。
参考:PHP: DateTime::format – Manual
2行目
return $timeObj && $timeObj->format('H:i') === $time;
&&で2つの条件をチェックしています。
前半では、1行目でDateTime型のオブジェクトが生成できたことをチェックしています。
(先ほどのメソッドの戻り値は(DateTime|false)です。)
後半では、format()メソッドを用いて文字列に変換し、その文字列が元の文字列と一致することを確認しています。
引数には変換するフォーマットを与えます。
どちらもtrueが返ってきた場合、元の文字列は有効だと判定できます。
(初めの関数の場合、trueを返します。)
日付のバリデーションはcheckdate()が使える
日付の場合はcheckdate()関数が使えます。
checkdate ( int $month , int $day , int $year ) : bool
checkdate(2, 29, 2020); // true
checkdate(2, 29, 2021); // false
閏年もきちんと考慮されます。
ただし、引数を見て分かるように、月・日・年をそれぞれ渡さなければならない点には注意が必要です。