Laravel 5.3 date validator: equal to or after start_date

感情迁移 提交于 2019-12-09 07:48:15

问题


I'm using Laravel 5.3 to validate start_date and end_date for an event. end_date should be equal to start_date or the after date. end_date >= start_date

$validator = Validator::make($data, [
    'start_date'    => 'required|date',
    'end_date'      => 'required|date|after:start_date',
]);

I tried to use after, but it only works for end_date > start_date. Of course, I can add custom rule using Validator::extend, but I'd like to know if we can do without adding custom rule.

Is there any way to add negative rule or add >= rule?

Thanks


回答1:


$validator = Validator::make($data, [
    'start_date'    => 'required|date',
    'end_date'      => 'required|date|after_or_equal:start_date',
]);

Use after_or_equal




回答2:


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.




回答3:


upgarate to 5.4 and you can use after_or_equal see https://laravel.com/docs/5.4/validation#rule-after-or-equal




回答4:


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
    ]
];


来源:https://stackoverflow.com/questions/41342818/laravel-5-3-date-validator-equal-to-or-after-start-date

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!