Laravelの日付のバリデーションまとめ

今回は、日付についてのバリデーションを確認します。

確認するルールはdatedate-formatdate-equalsafterafter-or-equalbeforebefore-or-equaltimezoneです。

date | 日付

strtotime関数で正当性を検査し、date_parse関数で相対指定(+1dayなど)でないことをチェックします。

PHP
$rules = ['parameter' => 'date'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// 英語表記
$data = ['parameter' => '10 September 2000'];
Validator::make($data, $rules)->passes(); // true

// 相対表記
$data = ['parameter' => 'now'];
Validator::make($data, $rules)->passes(); // false

// 相対表記
$data = ['parameter' => '+1 day'];
Validator::make($data, $rules)->passes(); // false

// 日時表記
$data = ['parameter' => '2006-12-12 10:00:00'];
Validator::make($data, $rules)->passes(); // true

// 日付表記
$data = ['parameter' => '2006-12-12'];
Validator::make($data, $rules)->passes(); // true

// 日時表記(スラッシュ区切り)
$data = ['parameter' => '2006/12/12 10:00:00'];
Validator::make($data, $rules)->passes(); // true

// 日付表記(スラッシュ区切り)
$data = ['parameter' => '2006/12/12'];
Validator::make($data, $rules)->passes(); // true

// 日付の区切りなし
$data = ['parameter' => '20061212'];
Validator::make($data, $rules)->passes(); // true

// 時間表記
$data = ['parameter' => '10:00:00'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。

date_format | 日付フォーマット

DateTime::createFromFormatでパース後、引数の形式に再フォーマットを行い、入力値と一致するかをチェックします。

PHP
$rules = ['parameter' => 'date_format:Y-m-d H:i:s'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// 正常系
$data = ['parameter' => '2023-12-31 23:59:59'];
Validator::make($data, $rules)->passes(); // true

// 正常系
$data = ['parameter' => '2023-01-01 00:00:00'];
Validator::make($data, $rules)->passes(); // true

// 前ゼロの省略
$data = ['parameter' => '2023-1-1 00:00:00'];
Validator::make($data, $rules)->passes(); // false

// 不足
$data = ['parameter' => '2023-12-31'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。

date_equals | 日付の一致

入力した日付が引数で指定した日付と一致するかをチェックします。
引数には日付だけでなく、比較対象のフィールド名を指定することで、2つのフィールドが同一の日であることをチェックできます。
また、date_formatのルールが一緒に設定されている場合は、パースする際に利用されます。

日付文字列を引数に指定

PHP
$rules = ['parameter' => 'date_equals:2023-12-01'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// 一致
$data = ['parameter' => '2023-12-01'];
Validator::make($data, $rules)->passes(); // true

// 不一致
$data = ['parameter' => '2023-12-02'];
Validator::make($data, $rules)->passes(); // false

// 表記のブレ
$data = ['parameter' => '2023/12/01'];
Validator::make($data, $rules)->passes(); // true

// 一致してしまう
$data = ['parameter' => '2023-11-31'];
Validator::make($data, $rules)->passes(); // true

// 時分秒を指定しない場合は00:00:00として扱われるため一致
$data = ['parameter' => '2023-12-01 00:00:00'];
Validator::make($data, $rules)->passes(); // true

// 時分秒を指定しない場合は00:00:00として扱われるため不一致
$data = ['parameter' => '2023-12-01 00:00:01'];
Validator::make($data, $rules)->passes(); // false

フィールド名を引数に指定

PHP
$rules = ['firstDate' => 'date_equals:secondDate'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['firstDate' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['firstDate' => ''];
Validator::make($data, $rules)->passes(); // true

// 一致
$data = [
'firstDate' => '2023-12-01',
'secondDate' => '2023-12-01',
];
Validator::make($data, $rules)->passes(); // true

// 比較先がnull
$data = [
'firstDate' => '2023-12-01',
'secondDate' => null,
];
Validator::make($data, $rules)->passes(); // false

// 不一致
$data = [
'firstDate' => '2023-12-01',
'secondDate' => '2023-12-02',
];
Validator::make($data, $rules)->passes(); // false

// 時分秒まで一致
$data = [
'firstDate' => '2023-12-01 01:00:00',
'secondDate' => '2023-12-01 01:00:00',
];
Validator::make($data, $rules)->passes(); // true

// 時分秒が不一致
$data = [
'firstDate' => '2023-12-01 01:00:00',
'secondDate' => '2023-12-01 01:00:01',
];
Validator::make($data, $rules)->passes(); // false

// フォーマット違い
$data = [
'firstDate' => '2023-12-01',
'secondDate' => '2023/12/01',
];
Validator::make($data, $rules)->passes(); // true

// 一致してしまう
$data = [
'firstDate' => '2023-12-01',
'secondDate' => '2023-11-31',
];
Validator::make($data, $rules)->passes(); // true

// 時分秒を指定しない
$data = [
'firstDate' => '2023-12-01 00:00:00',
'secondDate' => '2023-12-01',
];
Validator::make($data, $rules)->passes(); // true

日付のチェックは気を遣おう

2023-11-31はパースされると、2023-12-01となるため、上記のサンプルのようにdate_equalsルールのみを指定した場合に意図しない値を許容してしまいます。
dateのルールを一緒に設定することで、2023-11-31はバリデーションエラーとできます。

時分秒を指定しない場合に、00:00:00として扱われるため、2023-12-01と一致するかのチェックに対して、2023-12-01 00:00:00という値を許容します。
date_formatのルールをに設定することでフォーマットを守ることができます。

Laravelでの実装はこちら。

after | 指定日よりも後

引数に日付を指定した場合は、入力値 > 引数の日付であることをチェックします。
比較対象のフィールド名を指定することで、入力値 > 比較対象のフィールドであることをチェックします。

日付文字列を引数に指定

PHP
$rules = ['parameter' => 'after:2023-12-10'];

// 前日
$data = ['parameter' => '2023-12-09'];
Validator::make($data, $rules)->passes(); // false

// 当日
$data = ['parameter' => '2023-12-10'];
Validator::make($data, $rules)->passes(); // false

// 翌日
$data = ['parameter' => '2023-12-11'];
Validator::make($data, $rules)->passes(); // true

フィールド名を引数に指定

PHP
$rules = ['parameter' => 'after:secondDate'];

$data = [
'firstDate' => '2023-12-09',
'secondDate' => '2023-12-10',
];
Validator::make($data, $rules)->passes(); // false

$data = [
'firstDate' => '2023-12-10',
'secondDate' => '2023-12-10',
];
Validator::make($data, $rules)->passes(); // false

$data = [
'firstDate' => '2023-12-11',
'secondDate' => '2023-12-10',
];
Validator::make($data, $rules)->passes(); // true

Laravelでの実装はこちら。

after_or_equal | 指定日以降

引数に日付を指定した場合は、入力値 ≧ 引数の日付であることをチェックします。
比較対象のフィールド名を指定することで、入力値 ≧ 比較対象のフィールドであることをチェックします。

before | 指定日よりも前

引数に日付を指定した場合は、引数の日付 > 入力値であることをチェックします。
比較対象のフィールド名を指定することで、比較対象 > 入力値のフィールドであることをチェックします。

before_or_equal | 指定日以前

引数に日付を指定した場合は、引数の日付 ≧ 入力値であることをチェックします。
比較対象のフィールド名を指定することで、比較対象 ≧ 入力値のフィールドであることをチェックします。

timezone | タイムゾ-ン文字列

timezone_identifiers_list の関数に定義されているかをチェックします。
大文字、小文字も区別されます。

PHP
$rules = ['parameter' => 'timezone'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// 東京
$data = ['parameter' => 'Asia/Tokyo'];
Validator::make($data, $rules)->passes(); // true

// 当日
$data = ['parameter' => 'asia/Tokyo'];
Validator::make($data, $rules)->passes(); // false

// UTC
$data = ['parameter' => 'UTC'];
Validator::make($data, $rules)->passes(); // true

// utc
$data = ['parameter' => 'utc'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。