简述
你的日期字符串和日期格式不同,你需要更改格式字符串或修改日期字符串使它们匹配。
解释
问题
当Carbon的createFromFormat
函数接收到与传递的格式字符串不匹配的日期字符串时,就会出现此错误。更准确地说,这来自于DateTime::createFromFormat
函数,因为Carbon只是调用该函数:
public static function createFromFormat($format, $time, $tz = null)
{
if ($tz !== null) {
$dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
} else {
$dt = parent::createFromFormat($format, $time);
}
if ($dt instanceof DateTime) {
return static::instance($dt);
}
$errors = static::getLastErrors();
throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors']));
}
数据不足
如果您的日期字符串“长度”比格式字符串短,就像在这种情况下:
Carbon::createFromFormat('Y-m-d H:i:s', '2017-01-04 00:52');
Carbon会抛出以下异常:
在Carbon.php的第425行抛出无效参数异常:
数据缺失
数据过多
如果您的日期字符串比格式字符串“长”,就像在这种情况下一样:
Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');
Carbon会抛出以下异常:
在Carbon.php的第425行发生InvalidArgumentException:
尾随数据
内部原理
根据变换器文档,默认日期格式为:'Y-m-d H:i:s'
。日期处理发生在模型的asDateTime
函数中。在最后一个条件中,调用了getDateFormat
函数,这就是自定义格式的来源。默认格式在数据库的Grammar
类中定义。
解决方案
您必须确保日期字符串与格式字符串匹配。
更改格式字符串
您可以像这样覆盖默认的格式字符串:
class Event extends Model {
protected $dateFormat = 'Y-m-d H:i';
}
这种方法存在两个问题:
- 这将应用于模型中定义的
$dates
数组中的每个字段。
- 您必须以这种格式存储数据在数据库中。
编辑和格式化日期字符串
我推荐的解决方案是,日期格式应保持默认的'Y-m-d H:i:s'
,并且您应该完成日期中缺失的部分,例如:
public function store(Request $request) {
$requestData = $request->all();
$requestData['start_time'] .= ':00';
$requestData['end_time'] .= ':00';
$event = new Event($requestData);
$event->save();
}
当您想使用日期时,应对其进行格式化:
public function show(Request request, $eventId) {
$event = Event::findOrFail($eventId);
$startTime = $event->start_time->format('Y-m-d H:i');
$endTime = $event->end_time->format('Y-m-d H:i');
}
当然,这些字段应该被改变为日期:
class Event extends Model {
protected $dates = [
'start_time',
'end_time',
'created_at',
'updated_at',
'deleted_at',
];
}