Laravel “Unexpected data found” error when trying to change format of Carbon created_at date

匿名 (未验证) 提交于 2019-12-03 02:06:01

问题:

When I try to modify the format of the default created_at field of my Resource model, I get the following error:

{      "error":{         "type":"InvalidArgumentException",       "message":"Unexpected data found.                  Unexpected data found.                  The separation symbol could not be found                  Unexpected data found.                  A two digit second could not be found",       "file":"\/var\/www\/html\...vendor\/nesbot\/carbon\/src\/Carbon\/Carbon.php",       "line":359    } } 

Here is the code that produced the above error:

$tile = Resource::with('comments, ratings')->where('resources.id', '=', 1)->first(); $created_at = $tile->created_at; $tile->created_at = $created_at->copy()->tz(Auth::user()->timezone)->format('F j, Y @ g:i A'); 

If I remove ->format('F j, Y @ g:i A') from the above code, it works fine, but it's not in the format I want. What could the problem be? I have almost identical code elsewhere in my app and it works without error.

UPDATE: Using setToStringFormat('F j, Y @ g:i A') does not cause an error, but returns null.

回答1:

Adding the following code to my model worked for me:

public function getCreatedAtAttribute($date) {     if(Auth::check())         return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->copy()->tz(Auth::user()->timezone)->format('F j, Y @ g:i A');     else         return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->copy()->tz('America/Toronto')->format('F j, Y @ g:i A'); }  public function getUpdatedAtAttribute($date) {     return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('F j, Y @ g:i A'); } 

This allows me to use created_at and updated_at in the format I want.



回答2:

I did experience the same problem, and in my search for an answer I stumled across How do you explain the result for a new \DateTime('0000-00-00 00:00:00')? .

I decided to change the datetime-columns in the database to nullable with default value = NULL, to prevent fields from having value '0000-00-00 00:00:00'.

My migration in laravel 5 looks like this:

Schema::table('table', function($table) {     $table->dateTime('created_at')->nullable()->default(null)->change();     $table->dateTime('updated_at')->nullable()->default(null)->change(); }); 


回答3:

It's not a carbon issue, it's a conflict between a setAttribute or getAttribute in your model.



回答4:

You shouldn't try to change the format of created_at. It has to be a Carbon object. If you want to display the created_at date in a different format, then just format it at the time you output it. Or you may want to create a method that changes the format so you can call it whenever you want it in a different format. For example, add a method like this to your Resource class:

public function createdAtInMyFormat() {    return $this->created_at->format('F j, Y @ g:i A'); } 

You can also have that function adjust the timezone, etc. Then you can use $tile->createdAtInMyFormat() for example to get your special format created_at from your $tile object.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!