В настоящее время я работаю над проектом WordPress, где я должен получить несколько пользовательских метаданных, преобразовать их в DateTime
например, и сделать математику с этим.
Когда я echo
get_post_meta, это выглядит следующим образом.
2016.04.30 вечера 7:30
Формат, который я использую, чтобы получить DateTime
пример заключается в следующем.
Y.m.d A g: i
Но возвращаемое значение 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();
}
Результат False format: 2016.04.30 PM 7:30
,
Что мне здесь не хватает? Я думаю, что это должно быть что-то тривиальное, но я не могу пройти.
Тестируя, я обнаружил, что символ проблемы в формате был «А». Так что я осмотрелся и нашел это ошибка в PHP (это, очевидно, не ошибка вообще!)
Проходя через исходный код, похоже, что он не будет анализировать AM и PM, пока не будет проанализирован час.
Вероятно, вашей лучшей ставкой будет быстрый переход к регулярному выражению, чтобы переместить AM / PM в конец:
$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);
Измените формат даты и попробуйте 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];
Затем попробуйте передать это 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();
}