Laravel Carbon Data Missing

时间:2016-01-23 19:50:34

标签: 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

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

7 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:4)

您可以像Christian所说的那样在模型中设置$ dateFormat,但如果您不想将updated_at和created_at字段强加到操作中,您可以使用事件“更正”datetime对象,然后再将其保存到数据库中

在这里您有关于它的官方文档:https://laravel.com/docs/5.2/eloquent#events

答案 2 :(得分:4)

模型

此功能已禁用,即日期时间内碳的模拟 https://laravel.com/docs/5.0/eloquent#date-mutators

import cv2
import numpy as np
import os
import time
import datetime
import urllib
import pynotify

stream=urllib.urlopen('http://user:pass@192.168.198.120/video.mjpg')
bytes=''
fgbg = cv2.createBackgroundSubtractorMOG2()

while True:
    bytes+=stream.read(16384)
    a = bytes.find('\xff\xd8')
    b = bytes.find('\xff\xd9')
    if a!=-1 and b!=-1:
        jpg = bytes[a:b+2]
        bytes= bytes[b+2:]
        img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.IMREAD_COLOR)
        rows,cols,c = img.shape
        mask = np.zeros(img.shape, dtype=np.uint8)
        roi_corners = np.array([[(940,220),(1080,240), (1080,310), (940,290)]], dtype=np.int32)
        channel_count = img.shape[2]
        ignore_mask_color = (255,)*channel_count
        cv2.fillPoly(mask, roi_corners, ignore_mask_color)
        masked_image = cv2.bitwise_and(img, mask)

        fgmask = fgbg.apply(masked_image)
        iii = fgmask[220:310,940:1080]

        hist,bins = np.histogram(iii.ravel(),256,[0,256])

        black, white, cnt1, cnt2 = 0,0,0,0


        for i in range(0,127):
            black += hist[i]
            cnt1+=1
        bl = float(black / cnt1)

        for i in range(128,256):
            white += hist[i]
            cnt2+=1
        wh = float(white / cnt2)

        finalResult = ((bl+1) / (wh+1))/10

    if finalResult < 1.0:
        pynotify.init("cv2alert")
            notice = pynotify.Notification('Alert', 'Alert text')
            try:
                notice.show()
            except gio.Error:
                print "Error"

答案 3 :(得分:3)

您需要在模型中将protected $dateFormat设为'Y-m-d H:i',请参阅https://laravel.com/docs/5.2/eloquent-mutators#date-mutators

答案 4 :(得分:0)

确保您没有在数据库的某些行中省略“ created_at”或“ updated_at”字段,这是必需的;如果是这种情况,请删除它们具有这些空字段的记录,或以有效的时间戳格式输入值,例如'2018-09-01 15:18:53'。

答案 5 :(得分:0)

这是一种可能性

您需要检查结果数据列。如果您的列名“ created_at”或“ updated_at”为空,那么它将通过此​​错误进行。

如何解决? 首先,您需要使用Laravel carbon将数据存储在这两列中。 例如:

$user = new User();
$user->created_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->updated_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->save();

仅此而已,我希望它能起作用

快乐编码。...

答案 6 :(得分:0)

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

我们扩展了班级结局,删除了.v