Laravel 5.3 日期验证器:等于或之后start_date

2022-08-30 10:02:30

我正在使用Laravel 5.3来验证start_date并为事件end_date。end_date应等于start_date或之后的日期。end_date >= start_date

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

我试图在之后使用,但它只适用于end_date > start_date。当然,我可以使用 添加自定义规则,但我想知道我们是否可以在不添加自定义规则的情况下完成。Validator::extend

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

谢谢


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

使用after_or_equal


答案 2

将验证规则设置为 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'
    ]
];

Laravel 将所有日期字段传递到函数中。包括字符串。并将返回一个包含当前分钟,小时和秒的unix时间戳。strtotime()nowstrtotime('now')

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

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

而且您始终无法通过验证(不包括一天的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
    ]
];

推荐