2015-05-12 6 views
7

Quando eseguo questo, il primo viene creato correttamente in una data. Il secondo fallisce, restituendo un boolean e quindi non posso formattare. È il momento fuori dal raggio d'azione?Perché DateTime :: createFromFormat() fallisce e restituisce un valore booleano nel mio secondo esempio?

//works correctly 
$startDate = "2015-05-06 10:49:20.637133"; 
$start = DateTime::createFromFormat('Y-m-d h:m:s.u',$startDate); 
echo $start->format('m/d/y'); 

//doesn't work correctly 
$startDate = "2015-05-12 15:49:06.821289"; 
$start = DateTime::createFromFormat('Y-m-d h:m:s.u',$startDate); 
echo $start->format('m/d/y'); 

Code to reproduce the error

+0

problema simile a: https: //stackoverflow.com/questions/21257536/php-datetime-parsing-string-date-fails ma non credo che il problema sia lo stesso – depperm

risposta

10

Modificare il h ad una grande H, dal momento che il piccolo è formato a 12 ore e il grande è formato a 24 ore.

È possibile visualizzare tutti i formati nello manual. E una citazione da lì:

h formato 12 ore di un'ora con zeri iniziali 01 a 12
H formato 24 ore di un'ora con zeri iniziali 00 a 23

Significa che adesso il tuo codice non funziona, perché non c'è 15 nel formato 12 ore.

+1

non importa il fatto che hai Ymd h: m: s ... due m ... il secondo dovrebbe essere i per minuti. – jsnfwlr

10

Controllare DateTime::getLastErrors():

php > var_dump(DateTime::createFromFormat('Y-m-d h:m:s',"2015-05-12 15:49:06")); 
bool(false) 

php > var_dump(DateTime::getLastErrors()); 
array(4) { 
    ["warning_count"]=> 
    int(1) 
    ["warnings"]=> 
    array(1) { 
    [19]=> 
    string(27) "The parsed date was invalid" 
    } 
    ["error_count"]=> 
    int(1) 
    ["errors"]=> 
    array(1) { 
    [11]=> 
    string(30) "Hour can not be higher than 12" 
+0

wow, non sapevo che i messaggi di errore di DateTime fossero così diretti! (Penso che "L'ora non può essere più alta di 12" è un suggerimento abbastanza buono :) – Rizier123

2

In aggiunta alle altre risposte, per formati standard compresi da DateTime non c'è bisogno di creare da un formato:

$startDate = "2015-05-12 15:49:06.821289"; 
$start = new DateTime($startDate); 
echo $start->format('m/d/y');