Carbon (laravel) 处理无效日期

Carbon (laravel) deal with invalid date

我有一个非常简单的问题.. 我将 Carbon::parse($date) 函数与 $date = '15.15.2015' 一起使用。当然它不能 return 一个有效的字符串,因为没有第 15 个月。但是我如何 "ignore" 错误信息呢? 很棒的是

if (Carbon::parse($date) != error) Carbon::parse($date);
else echo 'invalid date, enduser understands the error message';

你可以像这样捕获 Carbon 引发的异常:

try {
    Carbon::parse($date);
} catch (\Exception $e) {
    echo 'invalid date, enduser understands the error message';
}

后期编辑:从 2020 年 5 月 13 日发布的 Carbon 版本 2.34.0 开始,抛出了一种新型异常:Carbon\Exceptions\InvalidFormatException

因此,如果您使用的是较新版本的 Carbon,实际上可以更优雅地执行此操作

try {
    Carbon::parse($date);
} catch (\Carbon\Exceptions\InvalidFormatException $e) {
    echo 'invalid date, enduser understands the error message';
}

感谢 Christhofer Natalius 指出这一点!

在使用前通过Laravel's validation。像这样创建一个验证器:

     protected function validator(array $data)
{
    //$data would be an associative array like ['date_value' => '15.15.2015']
    $message = [
        'date_value.date' => 'invalid date, enduser understands the error message'
    ];
    return Validator::make($data, [
        'date_value' => 'date',
    ],$message);
}

并在使用你的约会对象之前给他打电话:

$this->validator(['date_value' => $date])->validate();
// $this->validator(request()->all())->validate(); you can pass the whole request if fields names are the same

Carbon::parse($date);

您可以将所有需要的字段添加到验证器并应用多个验证来处理每条消息或使用默认消息。如果您正在验证用户的输入

,这就是这种方式

试试这个

$birth_date = Carbon::createFromFormat('dmy', $birth_date_mark)->startOfDay();
if ($birth_date->format('dmy') !== $birth_date_mark) {
     throw new OperationException(trans('exception.invalid_birth_date'));
}

另一个解决方案是全局处理异常。

  • 在 app/Exceptions/Handler.php
use Carbon\Exceptions\InvalidFormatException;
  • 然后在 render 方法中检查 Carbon 是否抛出异常
    if ($exception instanceof InvalidFormatException) {
            return response()->json([
                'status' => 'fail',
                'data' => [
                    'message' => 'Invalid date formate!'
                ]
            ], 400);
        }

try...catch... 和验证器都很好。山姆的回答也不错

在 Laravel 8 中,我使用以下代码:

// app/Exceptions/Handler.php

use Carbon\Exceptions\InvalidFormatException;

public function register()
{
    $this->renderable(function (InvalidFormatException $e, $request) {
        return response()->json([
            'message' => 'Invalid date format!.'
        ], 400);
    });
}

InvalidFormatException 抛出时,Laravel 将 return http 状态 400 和 json 与 message

如果您不想在每个 Carbon::parse() 部分都使用 try...catch...,这是处理异常的好方法。