2016-04-22 5 views
6

Ich arbeite gerade an einem Wordpress-Projekt, wo ich einige benutzerdefinierte Post-Metadaten erhalten soll, umwandeln Sie es in eine DateTime Instanz, und machen Sie die Mathematik damit.Was ist das richtige Format zum Erstellen einer PHP DateTime-Instanz von '2016.04.30 PM 7:30' über DateTime :: createFromFormat?

Wenn ich echo die get_post_meta, sieht es wie folgt aus.

2016.04.30 PM 7:30

Das Format Ich verwende ist eine DateTime Instanz wie folgt zu erhalten.

Y.m.d A g: i

Aber der Rückgabewert von DateTime::createFromFormat ist 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(); 
} 

Das Ergebnis ist False format: 2016.04.30 PM 7:30.

Was fehlt mir hier? Ich denke, es muss etwas Triviales sein, aber ich komme nicht durch.

Antwort

3

Testing, fand ich, dass das Problem im Format-war die ' EIN'. Also stocherte ich herum und fand diese bug in PHP (das ist anscheinend überhaupt kein Fehler!)

Geht man durch source code, sieht es aus wie es AM und PM nicht analysieren wird, bis nach einer Stunde bereits geparst wurde.

Wahrscheinlich wäre die beste Wahl einen schnellen Durchlauf durch einen regulären Ausdruck, um die AM/PM bis zum Ende zu bewegen:

$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

Ändern Sie das Datumsformat und versuchen 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]; 

Dann versuchen Sie diese zu DateTime::createFromFormat vorbei

$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

Vergessen Sie nicht aus dem Format-String zu ändern ' 'Ymd A g: i '' zu '' Ymd g: i A'' in Ihrem Beispiel. –

Verwandte Themen