Carbon \ Carbon :: now()抛出InvalidArgumentException,其中包含消息' Trailing data'

时间:2015-04-05 17:44:47

标签: laravel laravel-5 artisan php-carbon

在Laravel Artisan Tinker中运行以下内容时:

$article = new App\Article;
$article->published_at = Carbon\Carbon::now();

我收到此错误:

InvalidArgumentException with message 'Trailing data'

但是,Carbon\Carbon::now()自己会按预期返回Carbon个实例。

published_at应该通过模型中的protected $dates = ['published_at'];变为Carbon实例,并且它也包含在protected $fillable中。

任何人都知道这里发生了什么或我如何解决?


编辑:在路线中的闭包中运行时会发生同样的事情,因此不是特定于Tinker

编辑2:看起来其他人遇到这种情况:https://laracasts.com/discuss/channels/general-discussion/carboncarbonnow-giving-errorhttps://laracasts.com/series/laravel-5-fundamentals/episodes/8的评论两次

编辑3:与第一个示例完全相同的代码在https://laracasts.com/series/laravel-5-fundamentals/episodes/15中以15:10使用,没有错误。

编辑4:将上述代码的第2行交换为$article->published_at = Carbon::now()->format('Y-m-d');工作正常,甚至包括存储在数据库中的时间(虽然不确定原因)。

我猜测“尾随数据”可能指的是完整的日期时间太长,但是Laravel自动执行日期时间(例如自动转换为Carbon实例)似乎很奇怪,但不是这样。

虽然编辑3中的用法更合适!

7 个答案:

答案 0 :(得分:2)

我发现你不应该使用createFromFormat,除非第二个参数$date也是碳物体,但是如果它不是,那么它就是{&1;}只是一个你可以使用的字符串

public function setPublishedAtAttribute($date){
    $this->attributes['published_at'] = Carbon::parse($date);
}

我认为它需要花费更多的开销才能弄清楚它的格式,但这是我的临时解决方法。

' Y-M-d'是前端将其解析为表单的方式,但是它进入了一个数据库,这就是Carbon吐出的数据库。我得到了同样的错误:

[2015-08-16 21:35:57] production.ERROR: exception 'InvalidArgumentException' with message 'Trailing data' in /Users/alexanderkleinhans/laravel/vendor/nesbot/carbon/src/Carbon/Carbon     .php:414

我相信堆栈跟踪的第一部分,

Carbon\Carbon::createFromFormat('Y-m-d', Object(Carbon\Carbon))

表示第二个参数必须是Carbon对象,因此您可能必须确保表单上的情况而不仅仅是date('Y-m-d'),就像在PHP中一样。

答案 1 :(得分:1)

我正在关注Laracast教程,我遇到了同样的错误。我终于弄明白这个例外有什么问题。

在功能中:

public function setPublishedAtAttribute($date)
{
    $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date);
}

注意到我的$ date格式是' Y-m-d'

但是,在我的create.blade.php和edit.blade.php中,表单输入是:

{!! Form::input('data-date', 'published_at', date('d-m-Y'), ['class' => 'form-control']) !!} 

注意到我的日期格式是' d-m-Y'

这就是Laravel抛出异常的原因。

在所有文件中将日期格式与' Y-m-d' 相同后,异常消失。我希望这会有所帮助。

答案 2 :(得分:1)

如果数据库返回带有十进制microtime的日期值,则会出现此错误:

2016-10-06 20:16:23.96034

那些额外的十进制数字是问题所在。删除它们,它应该工作。

答案 3 :(得分:0)

使用Eloquent访问器删除该尾随数据,可以纠正包含尾随时区数据的日期:

public function getTimestampColumnAttribute()
{
    return Carbon::createFromFormat($this->dateFormat, strtok($this->attributes['timestamp_column'], '.'));
}

答案 4 :(得分:0)

我总是遇到这个问题,因为环境处理程序的日期不同。 我刚刚停止用碳追踪日期。.

public function getDates() { return []; }

答案 5 :(得分:0)

仅在模型中使用

get_node("/root/World/Player").get_position()

否则

protected $dateFormat = ' H:i:s.Y-m-du';

答案 6 :(得分:-2)

只需下载碳源文件并替换到供应商的碳目录中即可。而已... https://github.com/briannesbitt/Carbon/releases