2017-12-31 142 views
0

angularJsクライアントサイドアプリの日付時刻が2015-02-05T14:50:55+01:00となっているとします。laravelがISO8601のフォーマットされた日付時刻を認識しない

今、テーブルにMySQLをDATETIMEとして保存します。

これは、iso 8601という形式の日付時刻です。私は私のモデルにコードの下に追加このの理由:

protected $dateFormat = 'DATE_ISO8601'; 

しかし、私は、私はこのエラーを得た。この新しいフィールドで自分のモデルを更新したいとき:

A textual day could not be found 
Meridian can only come after an hour has been found 
The format separator does not match 
The format separator does not match 
The format separator does not match 
The timezone could not be found in the database 
Data missing {"userId":1,"email":"[email protected]","exception":"[object] (InvalidArgumentException(code: 0): A textual day could not be found 
Meridian can only come after an hour has been found 
The format separator does not match 
The format separator does not match 
The format separator does not match 
The timezone could not be found in the database 
Data missing at D:\\wamp\\www\\zarsystem\\vendor\ 
esbot\\carbon\\src\\Carbon\\Carbon.php:582) 
[stacktrace] 
#0 D:\\wamp\\www\\zarsystem\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(715): Carbon\\Carbon::createFromFormat('DATE_ISO8601', '2015-02-05T14:5...') 

私はDATE_ATOMのようないくつかの他の定義済み定数を試してみました、DATE_W3C、...同じエラーがありました。

私は混乱しています。私は何をすべきか分かりません。

+0

あなたのタイムスタンプは、有効なMySQLの 'datetime'([ここを参照してください](ないhttps://dev.mysql.com/doc/refman/5.7/en/datetimeを使用することをお勧めします.html))。 –

答えて

1

あなたは代わりにこれを行うことができます。

protected $dateFormat = 'c'; 

cは、ISO 8601の日付です。

http://php.net/manual/en/function.date.php

また、私はあなたがY-m-d H:i:sあるDBにおける標準フォーマットで日付を維持したい以前に言ったので、それはあなたが望むものではありません信じています。

だから、あなたはあなたがDBにそれを保存する前Y-m-d H:i:sに戻っISO 8601から変換するためにDBとa mutatorからそれを取得している後の日付を変換するためにan accessorを追加する必要があります。

デフォルトでは、タイムスタンプのフォーマットは「Y-m-d H:i:s」です。タイムスタンプ形式をカスタマイズする必要がある場合は、モデルの$ dateFormatプロパティを設定します。このプロパティは、日付属性がデータベースに格納されている方法を決定し、ならびにそれらの形式モデルはアレイまたはJSON

https://laravel.com/docs/5.5/eloquent-mutators#date-mutators

+0

私は 'protected $ dateFormat = 'c';'しようとしましたが、このエラーがあります: 'フォーマットセパレータが一致しません....... D:\\ wamp \\ www \\ zarsystem \\ vendor \\ laravel \\ framework \\ src \\ \\データベース\\ Eloquent \\ Concerns \\ HasAttributesを照会します。php(715):Carbon \\ Carbon :: createFromFormat( 'c'、 '2015-02-05T14:5 ...') ' –

+0

@ A.B.Developerので、本当にこの形式で保存しますか?この日付が必要なのは、フロントエンドの開発者がそれを求めたからです。そのような場合は、アクセサーとミューテータを作成するだけです。それでもやりたい場合は、[この汚れた修正](https://github.com/laravel/framework/issues/14247)を使用してください。 –

+0

私は 'created_at'、' updated_at'、 'birthday_date'、' wedding_date'のような多くの日付フィールドを持っていて、通常の日時MySQLフォーマットとして実際に保存されている間、クライアント側に 'ISO 8601'として日付時刻を送ることに成功します。クライアントが 'iso'として再度日付を送ったとき、私はそれをMySQLの日付形式に変更して保存しなければなりません。私はこれらのフィールドごとにアクセサとミューテータを作成し、自動的にlaravelにそれを実行させたいとは思わない。 –

0

DATE_ISO8601にシリアル化されたときDateTimeクラスで定義され、定数ありますあなたはあなたが

protected $dateFormat = \DateTime::DATE_ISO8601; 
を行うことができるはず 'DATE_ISO8601'

の書式マスク文字列を使用しようとしています

ただし、この形式はISO-8601と互換性がありませんが、下位互換性の理由からこの方法はそのままです。一定のATOM

protected $dateFormat = \DateTime::ATOM; 
関連する問題