tl;博士
您的日期字符串和您的日期格式不同,您必须更改格式字符串或修改日期字符串以使其匹配。
说明
问题
当 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); // Where the error happens.
}
if ($dt instanceof DateTime) {
return static::instance($dt);
}
$errors = static::getLastErrors();
throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors'])); // Where the exception was thrown.
}
数据不足
如果您的日期字符串比这种情况下的格式字符串“短”:
Carbon::createFromFormat('Y-m-d H:i:s', '2017-01-04 00:52');
碳会抛出:
Carbon.php 第 425 行中的 InvalidArgumentException:
数据缺失
数据过多
如果您的日期字符串比这种情况下的格式字符串“长”:
Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');
碳会抛出:
Carbon.php 第 425 行中的 InvalidArgumentException:
追踪数据
引擎盖下
根据documentation on mutators,默认日期格式为:'Y-m-d H:i:s'。日期处理发生在Model's asDateTime function。在最后一个条件下,getDateFormat function 被调用,这就是自定义格式的来源。默认格式为defined in the Database's Grammar class。
解决方案
您必须确保日期字符串与格式字符串匹配。
更改格式字符串
您可以像这样覆盖默认格式字符串:
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',
];
}