2010-08-12 23 views
8

PHP - DateTime :: createFromFormat - Devuelve nuevo objeto DateTime formateado según el formato especificadoDateTime :: createFromFormat - php tema formato

esto funciona:

$var = DateTime::createFromFormat('Ymd','20100809')->getTimestamp(); 

pero esta falla con

Llamar a una función miembro getTimestamp() en un objeto no

$var = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00')->getTimestamp(); 

Respuesta

14

En el caso que nos ocupa, la parte M:S está equivocada. Necesita ser i:s. Vea el manual on date().

Sin embargo, esto pone de relieve un problema conceptual más profundo: una entrada incorrecta en cualquiera de los parámetros dará lugar a un error fatal, que es un mal comportamiento para una aplicación en producción.

Desde el manual sobre createFromFormat:

devuelve una nueva instancia DateTime en caso de fallo.

Cuando la llamada no genera una fecha a partir de su entrada, no se devuelve ningún objeto.

para evitar errores fatales en las entradas incorrectas, usted (por desgracia, ya que esto rompe el buen encadenamiento) tiene que comprobar primero el funcionamiento correcto:

$var = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00'); 

if ($var instanceof DateTime) 
    echo $var->getTimestamp(); 
+1

No 'm: s'; 'i: s'. 'm' es para polilla. – Artefacto

+0

@Artefacto, por supuesto, aplausos. Corregido –

0

Uso s en lugar de S y m en lugar de m

  • s - segundos, con ceros a la izquierda
  • S - sufijo ordinal Inglés para la día del mes, 2 caracteres como st, nd, rd o º

y

  • m - Representación numérica de un mes
    , con ceros a la izquierda
  • M - representación textual corta de un mes, tres letras como Jan a través de Dic
0

H: M: S M es el mes nombre corto y S es ordinal (st, nd, rd,) días del mes intento H: i: s

7

Cabe

DateTime::createFromFormat('Y/m/d H:i:s','2010/08/09 07:47:00')->getTimestamp() 
            ^^ 

Ver date para el formato utilizado.

En esta circunstancia también puede usar strtotime. Esto daría el mismo resultado:

strtotime('2010/08/09 07:47:00') 

Otra forma:

date_create('2010/08/09 07:47:00')->getTimestamp() 

en cuenta que DateTime::createFromFormat vuelve FALSE en caso de error. Puede buscar los errores con DateTime::getLastErrors():

<?php 
$d = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00'); 
var_dump($d); 
var_dump(DateTime::getLastErrors()); 

daría:

 
bool(false) 
array(4) { 
    ["warning_count"]=> 
    int(0) 
    ["warnings"]=> 
    array(0) { 
    } 
    ["error_count"]=> 
    int(3) 
    ["errors"]=> 
    array(1) { 
    [14]=> 
    string(13) "Trailing data" 
    } 
}
Cuestiones relacionadas