2016-04-22 8 views
6

Attualmente sto lavorando su un progetto Wordpress in cui dovrei ottenere dei metadati personalizzati, convertirlo in un'istanza DateTime e fare i conti con esso.Qual è il formato corretto per creare un'istanza DateTime PHP di '2016.04.30 PM 7:30' tramite DateTime :: createFromFormat?

Quando I echo get_post_meta, appare come segue.

2016.04.30 PM 7:30

Il formato che sto usando per ottenere un'istanza DateTime è la seguente.

Y.m.d A g: i

Ma il valore di ritorno di DateTime::createFromFormat è false.

// 2016.04.30 PM 7:30 
$start_at = DateTime::createFromFormat('Y.m.d A g:i', get_post_meta(get_the_ID(), 'as_date', true)); 
if ($start_at === false) { 
    echo 'False format: ' . get_post_meta(get_the_ID(), 'as_date', true); 
} else { 
    echo $start_at->getTimestamp(); 
} 

Il risultato è False format: 2016.04.30 PM 7:30.

Cosa mi manca qui? Penso che debba essere qualcosa di banale ma non riesco a passare.

risposta

3

test, ho trovato che il personaggio problema nel formato era il ' UN'. Così ho curiosato e ho trovato questo bug in PHP (che non è apparentemente un bug a tutti!)

Attraversando il source code, sembra che non sarà analizzare AM e PM fino a quando dopo un'ora è già stato analizzato.

probabilmente la soluzione migliore sarebbe un passaggio veloce attraverso un'espressione regolare per spostare l'AM/PM fino alla fine:

$thedate = get_post_meta(get_the_ID(), 'as_date', true); 
$thedate = preg_replace("/([0-9.]+) ([ap]m) ([0-9:]+)/i", "$1 $3 $2", $thedate); 
$start_at = DateTime::createFromFormat('Y.m.d g:i A', $thedate); 
1

Cambiare il formato della data e prova createFromFormat

$non_standard_format = '2016.04.30 PM 7:30'; 
$non_standard_format = str_replace('.','-',$non_standard_format); 
$date_components = explode(" ",$non_standard_format); 
$standard_format = $date_components[0]." ".$date_components[2]." ".$date_components[1]; 

quindi provare passare questo a DateTime::createFromFormat

$start_at = DateTime::createFromFormat('Y-m-d g:i A', $standard_format); 
if ($start_at === false) { 
    echo 'False format: ' . get_post_meta(get_the_ID(), 'as_date', true); 
} else { 
    echo $start_at->getTimestamp(); 
} 

Supported date formats in PHP

+0

Non dimenticare di modificare la stringa di formato da ' 'Ymd A G: ''a'' Ymd g: i A'' nel tuo esempio. –

Problemi correlati