2017-12-31 143 views
0

Angenommen, wir haben eine 2015-02-05T14:50:55+01:00 formatierte Datum Uhrzeit, die von einer eckigenJS Client-Seite App kommt.Laravel erkennt nicht ISO8601 formatierte Datum Uhrzeit

Jetzt möchte ich es als DATETIME MySQL in einer Tabelle speichern.

Ich weiß, dass ist eine iso 8601 formatierte Datumszeit. aus diesem Grund habe ich Code unten zu meinem Modell:

protected $dateFormat = 'DATE_ISO8601'; 

Aber wenn ich mein Modell zu aktualisieren, mit diesem neuen Feld wollen habe ich diesen Fehler:

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...') 

Ich habe versucht, einige andere vordefinierte Konstanten wie DATE_ATOM , DATE_W3C, ... aber haben dieselben Erorrs.

Ich verwirrt und ich weiß nicht, was soll ich tun?

+0

Ihr Zeitstempel ist keine gültige MySQL 'datetime' ([siehe hier] (https://dev.mysql.com/doc/refman/5.7/en/datetime .html)). –

Antwort

1

Sie können dies stattdessen tun:

protected $dateFormat = 'c'; 

c ist nach ISO 8601.

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

Ich glaube auch, das ist nicht das, was Sie wollen, da Sie vorher gesagt haben Sie Daten in einem Standardformat in der DB halten wollen, die Y-m-d H:i:s ist.

Also, sollten Sie an accessor hinzufügen Datum zu verwandeln, nachdem Sie es von DB und a mutator sind immer zu Y-m-d H:i:s von ISO 8601 zurück zu verwandeln, bevor es an die DB zu speichern.

Standardmäßig werden Zeitstempel als 'Y-m-d H: i: s' formatiert. Wenn Sie das Zeitstempelformat anpassen müssen, legen Sie die Eigenschaft $ dateFormat in Ihrem Modell fest. Diese Eigenschaft legt fest, wie Datumsattribute in der Datenbank gespeichert sind, sowie deren Format, wenn das Modell auf ein Array oder JSON serialisiert

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

+0

Ich versuchte 'protected $ dateFormat = 'c'; aber ich habe diesen Fehler:' Der Formattrenner stimmt nicht überein ....... D: \\ wamp \\ www \\ zarsystem \\ vendor \\ laravel \\ framework \\ src \\ Illuminate \\ Database \\ Eloquent \\ Anliegen \ HasAttributes.php (715): Carbon \\ Carbon :: createFromFormat ('c', '2015-02-05T14: 5 ...') ' –

+0

@ A.B.Developer also, willst du es wirklich in diesem Format speichern? Sie haben gesagt, dass Sie dieses Datum nur benötigen, weil Ihr Frontend-Entwickler danach gefragt hat. Wenn das der Fall ist, möchten Sie nur einen Accessor und einen Mutator erstellen. Wenn Sie dies dennoch tun möchten, verwenden Sie [diesen schmutzigen Fix] (https://github.com/laravel/framework/issues/14247). –

+0

Ich habe viele Datumsfelder wie 'created_at',' updated_at', 'birthday_date',' wedding_date' und es ist mir gelungen, das Datum mal als 'ISO 8601' an die Clientseite zu senden, während es als normales Datum-Zeit-MySQL-Format gespeichert wurde. Jetzt, wenn der Client die Daten erneut als "iso" gesendet hat, muss ich ihn in das Datumsformat von MySQL ändern und speichern. Ich möchte keinen Accessor und Mutator für jedes dieser Felder schreiben und möchte es automatisch machen. –

0

DATE_ISO8601 ist eine Konstante, definiert in der DateTime Klasse Sie versuchen, eine Formatmaske Reihe von 'DATE_ISO8601'

Sie sollten

protected $dateFormat = \DateTime::DATE_ISO8601; 
Lage zu tun, verwenden

Dieses Format ist jedoch nicht kompatibel mit ISO-8601, wird jedoch aus Gründen der Abwärtskompatibilität aus diesem Grund beibehalten. so ist es besser, die ATOM Konstante

zu verwenden
protected $dateFormat = \DateTime::ATOM; 
Verwandte Themen