Laravel 5.3 date validator:等于或等于start_date

Pau*_* Z. 22 php validation laravel laravel-5.3

我正在使用Laravel 5.3来验证事件的start_date和end_date.end_date应该等于start_date或after date.end_date >= start_date

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

我尝试使用after,但它仅适用于end_date> start_date.当然,我可以使用添加自定义规则Validator::extend,但我想知道我们是否可以不添加自定义规则.

有没有办法添加否定规则或添加> =规则?

谢谢

小智 37

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

使用after_or_equal


Jam*_*ond 13

当您设置验证规则after_or_equal:now并且date_format格式没有小时、分钟或秒时要小心!

例如:

$validationRules = [
    'my_time_start' => [
        'date_format:Y-m-d',// format without hours, minutes and seconds.
        'after_or_equal:now'
    ]
];
Run Code Online (Sandbox Code Playgroud)

Laravel 将所有日期字段传递给strtotime()函数。包括now字符串。而strtotime('now')会返回一个Unix时间戳与当前的分钟,小时,秒

例如,今天的日期是2020-05-03。当您将日期值发送2020-05-03到脚本中时,Laravel 会将 2 个值传递strtotime()给比较:

strtotime('2020-05-03'); // always 1588489200
strtotime('now'); // NOT PREVIOUS VALUE, a different value each second, timestamp including current minutes, hour and seconds.
Run Code Online (Sandbox Code Playgroud)

并且您将始终无法通过验证(一天中的 1 秒除外)。

要修复它,您应该使用:

$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
    ]
];
Run Code Online (Sandbox Code Playgroud)


low*_*nds 5

实际上,当至少使用 Laravel 版本时,您还可以使用after_or_equal和。这可能有助于避免升级到更高的 Laravel 版本。before_or_equal5.3.31