gpt4 book ai didi

php - Laravel Carbon 数据丢失

转载 作者:IT王子 更新时间:2023-10-28 23:48:43 24 4
gpt4 key购买 nike

在我的模型中,我有以下内容:

protected $dates = [
'start',
'end',
'created_at',
'updated_at'
];

我正在使用日期时间选择器插入开始和结束日期,格式如下:

2016-01-23 22:00

没有秒。当我这样做时,我得到这个错误:

InvalidArgumentException in Carbon.php line 425:
Data missing
at Carbon::createFromFormat('Y-m-d H:i:s', '2016-01-23 22:00') in Model.php line 3015

如果我确实包括秒数,它就可以工作。秒数对我来说并不重要,我不想将它们包含在我的日期时间选择器字段中。有什么办法可以解决这个问题,这样我仍然可以将这些字段用作日期字段吗?

最佳答案

tl;dr

您的日期字符串和日期格式不同,您必须更改格式字符串或修改日期字符串以使其匹配。

说明

问题

当 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');

碳将抛出:

InvalidArgumentException in Carbon.php line 425:
Data missing

数据过多

如果您的日期字符串“长”于本例中的格式字符串:

 Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');

碳将抛出:

InvalidArgumentException in Carbon.php line 425:
Trailing data

引擎盖下

根据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',
];
}

关于php - Laravel Carbon 数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com