ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – Laravel Carbon Data Missing

2019-09-26 22:39:16  阅读:551  来源: 互联网

标签:php laravel format php-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

如果我确实包括秒,它就可以了.秒对我来说并不重要,我不想将它们包含在我的日期时间选择器字段中.任何方式,所以我仍然可以使用这些字段作为日期字段?

解决方法:

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

碳会抛出:

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,format,php-carbon
来源: https://codeday.me/bug/20190926/1822024.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有