web-dev-qa-db-ja.com

Laravel Carbonの日付を変更しようとしたときに「予期しないデータが見つかりました」エラーが作成されました_日付

リソースモデルのデフォルトのcreated_atフィールドのフォーマットを変更しようとすると、次のエラーが発生します。

_{  
   "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
   }
}
_

上記のエラーを生成したコードは次のとおりです。

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

上記のコードから->format('F j, Y @ g:i A')を削除すると、正常に機能しますが、希望する形式ではありません。問題は何でしょうか?アプリの他の場所にほぼ同じコードがあり、エラーなしで機能します。

PDATE:setToStringFormat('F j, Y @ g:i A')を使用してもエラーは発生しませんが、nullが返されます。

11
chipit24

モデルに次のコードを追加するとうまくいきました:

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

これにより、created_atおよびupdated_at必要な形式で。

13
chipit24

私は同じ問題を経験しました、そして私が困惑して答えを探して 新しい\ DateTime( '0000-00-00 00:00:00')の結果をどのように説明しますか?

フィールドの値が '0000-00-00 00:00:00'にならないように、データベースのdatetime-columnsをデフォルト値= NULLでNULL可能に変更することにしました。

laravel 5での私の移行は次のようになります:

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

これは炭素の問題ではなく、モデル内のsetAttributeまたはgetAttribute間の競合です。

5
alan

_created_at_の形式を変更しないでください。それはCarbonオブジェクトでなければなりません。 _created_at_の日付を別の形式で表示したい場合は、出力時にフォーマットしてください。または、フォーマットを変更するメソッドを作成して、別のフォーマットでいつでも呼び出すことができるようにすることもできます。たとえば、Resourceクラスに次のようなメソッドを追加します。

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

また、その関数にタイムゾーンなどを調整させることもできます。たとえば、$tile->createdAtInMyFormat()を使用して、_created_at_オブジェクトから特殊な形式_$tile_を取得できます。

2
orrd

ユーザーにこのコードを保存する前に、指定された日付を解析する必要がありました

Carbon::parse($request->input('some_date'));
0
saeed karimi

私はこの問題に遭遇しました、そしてそれは単にスラッシュの代わりにダッシュを使う問題でした。

$model->update(['some_date' => '2020/1/1']); // bad
$model->update(['some_date' => '2020-1-1']); // good

注意:モデルで日付を指定すると、Eloquentはそれを変換できるほど賢くなります。

protected $dates = [ 'some_date' ];
0
Matt