Laravel 5.3 date validator: equal to or after start_date
upgarate to 5.4 and you can use after_or_equal see https://laravel.com/docs/5.4/validation#rule-after-or-equal
Be careful when you set a validation rule after_or_equal:now
and date_format
with a format without hours, minutes or seconds!
For example:
$validationRules = [
'my_time_start' => [
'date_format:Y-m-d',// format without hours, minutes and seconds.
'after_or_equal:now'
]
];
Laravel passing all date fields into the strtotime()
function.
Including now
string.
And strtotime('now')
will return a unix timestamp with current minutes, hours and seconds.
For example, the today date is 2020-05-03
.
When you send a date value 2020-05-03
into your script, Laravel will pass 2 values into the strtotime()
for compare:
strtotime('2020-05-03'); // always 1588489200
strtotime('now'); // NOT PREVIOUS VALUE, a different value each second, timestamp including current minutes, hour and seconds.
And you will always fail a validation (exclude a 1 second of the day).
To fix it, you should use:
$validationRules = [
'my_time_start' => [
'date_format:Y-m-d',// format without hours, minutes and seconds.
'after_or_equal:' . date('Y-m-d'), // not 'now' string
]
];
$validator = Validator::make($data, [
'start_date' => 'required|date',
'end_date' => 'required|date|after_or_equal:start_date',
]);
Use after_or_equal
Actually, you can also use after_or_equal
and before_or_equal
when using at least Laravel version 5.3.31
. This may help to avoid having to upgrade to a higher Laravel version.