Laravel Carbon 数据丢失

新手上路,请多包涵

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

 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

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

原文由 Hardist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 857
2 个回答

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:

尾随数据

在引擎盖下

根据 有关 mutators 的文档, 默认日期格式为: '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',
    ];
}

原文由 totymedli 发布,翻译遵循 CC BY-SA 3.0 许可协议

对我来说,问题在于位于供应商 (vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\SqlServerGrammar.php) 中的 SQLServerGrammar。 SQLServerGramma 中的默认值为 Y-m-d H:i:s.v

我们扩展了类结束删除 .v

原文由 tety94 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题