2016-04-22 34 views
6

Obecnie pracuję nad projektem Wordpress, w którym powinienem uzyskać niestandardowe metadane postu, przekonwertować je na instancję DateTime i wykonać z nim matematykę.Jaki format jest odpowiedni do utworzenia wystąpienia PHP DateTime z dnia: 2016.04.30 PM 7:30 "przez DateTime :: createFromFormat?

Kiedy I echo get_post_meta, wygląda następująco.

2016.04.30 PM 7:30

Format Używam uzyskać instancję DateTime jest następujący.

Y.m.d Ag: i

Ale wartość zwracana DateTime::createFromFormat jest 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(); 
} 

Wynikiem jest False format: 2016.04.30 PM 7:30.

Czego mi tu brakuje? Myślę, że to musi być coś trywialnego, ale nie mogę się przedostać.

Odpowiedz

3

Testing, stwierdziliśmy, że postać problemem w formacie był ' ZA'. Więc poszperałem i znalazłem to bug in PHP (to najwyraźniej wcale nie jest błędem!)

Przechodząc przez source code, wygląda na to, że nie będzie parsować AM i PM, dopóki po godzinie nie zostanie przeanalizowana.

Prawdopodobnie najlepiej byłoby szybko przechodzą przez wyrażenie regularne, aby przesunąć AM/PM do końca:

$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

zmienić format daty i spróbuj 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]; 

Następnie spróbuj przechodzącej to 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

Nie zapomnij zmienić ciąg formatu z ' 'RMD G: i "do" "Ymd g: i A'" w twoim przykładzie. –