在Laravel请求中验证Bootstrap日期时间选择器

时间:2017-11-16 12:53:42

标签: php laravel validation date

我正在使用Bootstrap日期时间选择器,我正在尝试验证控制器中的日期,但它总是给我一个错误,说格式不正确!

但是我可以从请求数据中创建一个新的Carbon日期对象,但我无法使用相同的格式验证请求对象。

这会抛出错误,指出from与格式d M Y - H:i

不匹配
$request->validate([
            'from' => 'date_format:"d M Y - H:i"|required|before:till',
            'till' => 'date_format:"d M Y - H:i"|required|after:from'
    ]);

但是如果我在没有任何验证的情况下使用数据,这段代码就可以了。

$ride->from = Carbon::createFromFormat('d M Y - H:i', $request->from)->toDateTimeString();
$ride->till = Carbon::createFromFormat('d M Y - H:i', $request->till)->toDateTimeString();

注意的: 引导dateTimePicker有format: "dd MM yyyy - hh:ii"但我知道javascript格式与php格式不同。

这里出了什么问题?

编辑:这些是从转储请求对象获得的输入日期。

  "from" => "16 November 2017 - 14:10"
  "till" => "06 November 2017 - 12:00"

2 个答案:

答案 0 :(得分:1)

因为使用beforeafter作为日期会转到strtotime进行检查,请在doc

中查看

16 Nov 2017 - 12:10无效日期检查not valid date请在删除- valid date

后进行检查

所以我建议你像这样转换

$from = str_replace("-","",$request->from);
$to = str_replace("-","",$request->to);
$request->validate([
        'from' => 'date_format:"d M Y - H:i"|required|before:'.$to,
        'till' => 'date_format:"d M Y - H:i"|required|after:'.$from
]);

答案 1 :(得分:0)

说实话,您不需要观看日期格式。完全没必要。我建议你做这样的事情:

$fromDate = Carbon::parse($request->get('from'));
$toDate = Carbon::parse($request->get('to'));

现在,上面的内容将允许您比较条件的日期,例如:

  • 检查您是否已通过有效日期。
  • 开始日期不应大于日期。
  • To Date不应小于开始日期。

然后你可以做类似的事情:

if (($startDate === false) || ($toDate === false)) {
    // return error
}

// Check start date is greater than to date
if ($startDate->gt($toDate)) {
}

// Check to date is not less than to date
if ($toDate->lt($toDate)) {
}    

只要您以正确的格式传递日期,这就足够了。您无需对日期格式进行验证。