Wie erstellen DateTime-Objekt aus string in symfony2/php
In eine DB-Tabelle habe ich mehrere Felder mit datetime
als Feld-Typ. Also ich muss die Persistenz der Daten nur als Datum-Zeit-Objekts.
Aus einem Formular bekomme ich Datum, Zeit as string wie
2012-10-05 17:45:54
Nun, Wann immer ich anhalten, meine Person bekomme ich folgenden Fehler:
Fatal error: Rufen Sie an eine member-Funktion format() on a non-object in
..\DateTimeType.php auf der Linie 44
Habe ich versucht mit
$protocol->setStartedAt(strtotime($post['started_at']));
oder
$from = \DateTime::createFromFormat('yy-mm-dd hh:mm:ss', $post['started_at']);
$protocol->setStartedAt($from);
oder nur
$from = new \DateTime($post['started_at']);
$protocol->setStartedAt($from);
Dem letzten code funktioniert, aber es nicht verwendet die timestamp übergeben als argument, sondern bekommt nur die aktuelle Zeit.
Irgendwelche Ideen?
- Sind Sie sicher, dass
$post['started_at']
enthält, was Sie es haben wollen? Ist es nicht$_POST['started_at']
? - Auch
DateTime
Objekt und Methoden Ausnahmen werfen Fehler. Bekommst du keine von denen? Versuchen Sie es mittry/catch
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ich immer DateTime-Objekt mit dem Konstruktor, os in deinem Fall wäre es:
ob das funktioniert, aber nicht mit dem Zeitstempel geschrieben, haben Sie wahrscheinlich nicht den Wert in $post['started_at']. Versuchen Sie, debugging oder auch nur tun die schmutzige trick:
var_dump
das Ergebnisnew DateTime()
und wenn es falsch verwendenvar_dump(\DateTime::getLastErrors())
für mehr details. php.net/manual/en/datetime.getlasterrors.phpuse
- Anweisung, dann der backslash wird nicht nötig sein. Andernfalls müssen Sie erklären, vollständigen Pfad zu der Klasse, in diesem Fall ist es im default-namespace, so dass nur ein backslash benötigt wurde.Für die künftigen Leser, die sicherlich, wird eines Tages dieses problem auftreten (dies ist der erste Eintrag wenn man bei google "symfony 2" datetime " aus "string"), im Hinterkopf behalten, dass in Symfony 2 das DateTime-Objekt NICHT akzeptiert eine Zeichenfolge, die mit diesem format :
"d/m/Y H:i:s"
, und wahrscheinlich nicht unterstützt, viele andere entweder.Zuliebe nicht immer mad, ich habe eigentlich fanden heraus, dass die einfachste und sicherste Lösung, um solche Fehler zu vermeiden, ist dieses hier:
Zunächst Holen Sie sich Ihren Termin string aus welcher Art von Anfrage, die Sie tun (In meinem Fall einer generischen AJAX-request) und konvertieren Sie es in ein DateTime-Objekt in diesem Beispiel wird davon ausgegangen, dass wir brauchen, um zu erstellen ein dateTime-Objekt für
25/04/2015 15:00
, die das format der jQuery-UI-Italienisch DateTimePicker (das ist nur ein Beispiel):(Hinweis: verwenden Sie
\
zur Verwendung der php-DateTime-Objekt, sonst werden Sie mit Symfony die datetime-Objekt, die werfen Sie eine Ausnahme)Dann, wenn Sie es getan haben, erstellen Sie eine Datum string mit dem Komfort format Funktion, indem der erste parameter die Ausgabe-format erwartet (
Y-m-d H:i:s
):In dieser Weise sind Sie 100% sicher, dass was auch immer Art von format, das Sie auf der Durchreise sind oder empfangen (dies wird korrekt umgewandelt werden und Sie werden nicht erhalten jede Art von Ausnahme von der DateTime-symfony-Objekt, , solange Sie bieten, was Sie erwarten als input.
Wissen, dass dieser Beitrag ist tatsächlich schon ziemlich alt, ich habe gerade beschlossen, zu posten, weil ich nicht finden, eine andere wertvolle Quelle ist aber dieses zu verstehen, wo das problem gewesen sein könnte.
Bitte beachten Sie, dass die beste Lösung ist immer noch zum senden das datetime-string in das richtige format schon, aber wenn Sie haben buchstäblich keine Möglichkeiten, das zu tun, dass der sicherste Weg, um zu konvertieren eine Zeichenfolge ist, die oben.
Wie etwa createFromFormat?
http://uk.php.net/manual/en/datetime.createfromformat.php
$from = \DateTime::createFromFormat('Y-m-d H:i:s', $post['started_at']);