2012-10-05 24 views
7

En una tabla DB tengo varios campos con datetime como tipo de campo. Por lo tanto, debo conservar los datos solo como objeto de fecha y hora.Cómo crear el objeto DateTime desde una cadena en symfony2/php

De una forma tenga tiempo la fecha como cadena como

2012-10-05 17:45:54 

Ahora, cuando cada vez persisto mi entidad consigo error siguiente:

Fatal error: Call to a member function format() on a non-object in ..\DateTimeType.php on line 44

he intentado con

$protocol->setStartedAt(strtotime($post['started_at'])); 

o

$from = \DateTime::createFromFormat('yy-mm-dd hh:mm:ss', $post['started_at']); 
$protocol->setStartedAt($from); 

o simplemente

$from = new \DateTime($post['started_at']); 
$protocol->setStartedAt($from); 

Los últimos trabajos de código pero no utiliza la marca de tiempo se pasa como argumento, pero sólo se pone la hora actual.

¿Alguna idea?

+0

¿Estás seguro de que '$ post ['started_at']' contiene lo que quieres? ¿No es '$ _POST ['started_at']'? –

+0

Además, el método y el método 'DateTime' arrojan excepciones en los errores. ¿No obtienes ninguno de esos? Intenta usar 'try/catch'. –

Respuesta

12

Siempre creo objeto DateTime con su constructor, el sistema operativo en su caso sería:

$protocol->setStartedAt(new \DateTime($post['started_at'])); 

si esto funciona, pero no utiliza la marca de tiempo publicado probablemente lo hacen no tiene el valor en $ post ['started_at']. Trate debuging o simplemente hacer el truco sucio:

die($post['started_at']); 
+0

Más depuración: 'var_dump' el resultado de' new DateTime() 'y si es falso use 'var_dump (\ DateTime :: getLastErrors())' para más detalles. http://php.net/manual/en/datetime.getlasterrors.php – yoshi

+0

¿Por qué la barra diagonal inversa? ¿Entonces Symfony no lo interpreta? – meles

+0

Puede agregar DateTime con una instrucción '' 'use''', luego la barra invertida no será necesaria. De lo contrario, debe declarar la ruta completa a la clase, en este caso está en el espacio de nombres predeterminado, por lo que solo se necesita una barra invertida. –

1

¿Qué tal createFromFormat?

http://uk.php.net/manual/en/datetime.createfromformat.php

$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s'); 
+0

Lo siento, acabo de ver que ya tiene esto; no funciona, ya que el formato parece incorrecto. Intenta usar la página enlazada para hacer coincidir exactamente tu formato: está en formato PHP, no en el extraño Symfony ... – watermanio

+0

No, todavía obtienes este error, Llama a un formato de función de miembro() en una línea DateTimeType.php sin objeto 44 –

+0

La solución anterior es falsa. Solución correcta = '$ from = \ DateTime :: createFromFormat ('Ymd H: i: s', $ post ['started_at']);' –

8

Por el bien de los futuros lectores que seguramente será algún día encontrar este problema (este es el primer mensaje si google "Symfony 2 de fecha y hora de la cadena"), Tenga en cuenta que en Symfony 2 el objeto DateTime NO acepta una cadena con ese formato: "d/m/Y H:i:s", y probablemente tampoco admita muchas otras.

En aras de no llegar a ser loca en que, en realidad, he descubierto que la solución más fácil y más seguro para evitar este tipo de errores es la siguiente:

primer lugar, obtener su fecha cadena de cualquier tipo de solicitud que está realizando (en mi caso, una solicitud AJAX genérica) y convertirlo a DateTime Object, este ejemplo asume que necesitamos crear un objeto dateTime para 25/04/2015 15:00, que es el formato de jQuery UI italian DateTimePicker (eso es solo un ejemplo):

$literalTime = \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00"); 

(nota: utilizar \ utilizar objeto DateTime de php, de lo que va a utilizar objetos de fecha y hora de Symfony que se producirá una excepción)

Luego, una vez que lo hizo, crear una cadena fecha usando la comodidad formato función, dando al primer parámetro el formato de salida esperado (Y-m-d H:i:s):

$expire_date = $literalTime->format("Y-m-d H:i:s"); 

de esta manera usted es 100% seguro de que cualquier tipo de formato que está de paso o recibiendo este se le podrá conve rted y no recibirá ningún tipo de excepción del objeto symfony DateTime, , siempre que proporcione lo que está esperando como entrada.

Sabiendo que esta publicación es bastante antigua, decidí publicarla porque no encontré ninguna otra fuente valiosa, pero esta para entender dónde podría haber estado el problema.

Tenga en cuenta que la mejor solución es enviar la cadena de fecha y hora en el formato correcto, pero si literalmente no tiene forma de hacerlo, la forma más segura de convertir dicha cadena es la de arriba.

Cuestiones relacionadas