Php Laravel5雄辩的默认日期转换器因JSON日期输入而失败

Php Laravel5雄辩的默认日期转换器因JSON日期输入而失败,php,json,laravel,laravel-5,Php,Json,Laravel,Laravel 5,我有一个带有日期变量的模型,比如在处创建的created\u。让我们假设一个通用的时间戳属性 当以JSON格式从客户端传递数据时,我将 { timestamp: "2016-06-07T22:00:00.000Z" } 该属性将用于设置某些模型,如下所示: $model = new Foo(); $model->timestamp = Input::get('timestamp'); 由于这将触发日期变量,phpCarbon将被调用并失败 InvalidArgumentExce

我有一个带有日期变量的模型,比如在处创建的
created\u。让我们假设一个通用的
时间戳
属性

当以JSON格式从客户端传递数据时,我将

{
    timestamp: "2016-06-07T22:00:00.000Z"
}
该属性将用于设置某些模型,如下所示:

$model = new Foo();
$model->timestamp = Input::get('timestamp');
由于这将触发日期变量,php
Carbon
将被调用并失败

InvalidArgumentException in Carbon.php line 425
Unexpected data found.
Trailing data
现在,这不是Carbon本身的问题,它能够处理JSON格式。如果你愿意试试的话

new Carbon('2016-06-07T22:00:00.000Z');
你实际上会得到预期的结果

据我所见,这个问题源于一种奇怪的雄辩行为。从Carbon.php第425行中的上述
InvalidArgumentException中查看此跟踪:

in Carbon.php line 425
at Carbon::createFromFormat('Y-m-d H:i:s', '2016-06-07T22:00:00.000Z') in Model.php line 2915
at Model->asDateTime('2016-06-07T22:00:00.000Z') in Model.php line 2871
at Model->fromDateTime('2016-06-07T22:00:00.000Z') in Model.php line 2826
at Model->setAttribute('timestamp', '2016-06-07T22:00:00.000Z') in Model.php line 3351
Eloquent正在尝试
createFromFormat
传递一个错误格式,该格式不反映实际的JSON格式,这导致了Carbon异常

另一方面,在这种情况下,像上面提到的
newcarbon($jsonDate)
这样的简单调用可以很好地工作

  • 我应该如何解决这个问题
  • 这不应该是一个雄辩的错误吗
  • ==编辑==

    我自己也没有编码任何变种人。我使用的默认日期变量如下:

    public function getDates() {
        return ['timestamp'];
    }
    

    当在
    getDates
    函数中设置属性时,Eloquent分析您给出的日期

    在它的分析中,它有四个步骤:(请参见
    Modal.php
    asDateTime
    方法进行说明,代码的注释非常好:)

  • 如果它已经是一个碳实例,请使用该实例
  • 如果它是实现DateTimeInterface的实例,请使用
  • 如果是数字,则解析为Unix时间戳
  • 如果是简单的年-月-日格式(由regex尝试),请使用该格式
  • 如果以上都没有,请使用指定为默认格式创建一个Carbon实例
  • 在你的情况下,1-4不匹配,所以它尝试5

    您没有在模型上指定自定义日期格式,因此它使用适用于您正在使用的数据库连接类型的默认日期格式。您可以通过向模型中添加$dateFormat变量来覆盖此选项:

    protected$dateFormat='U'

    但是您的正常时间戳可能已经是正确的格式了。所以这个解决方案不适合你

    在你的情况下,我只想:
    $model->timestamp=Carbon::parse(输入::get('timestamp')

    或者使用适当格式的
    Carbon::createFromFormat()


    我不知道他们为什么不直接用碳来解析它。我想它更容易出错,也更难控制。使用不同的国际格式,您可能会得到意想不到的结果(月和日切换等)。这也可能比他们目前的方法慢

    这应该如预期的那样起作用。你是如何定义突变子的?你能发布模型代码和
    Input::get('timestamp)
    的确切值吗(我假设它不是一个对象)。我将把这里设置的mutator留给测试:
    public function setTimestampAttribute($value){$this->attributes['timestamp']=new\Carbon\Carbon($value);}
    和控制器代码:
    $obj->timestamp='2016-06-07T22:00:00.000Z'请发布你的变种。我没有使用任何自定义变种,请参阅编辑。