通过 DateTime::createFromFormat 创建 '2016.04.30 PM 7:30' 的 PHP DateTime 实例的正确格式是什么?

What's the right format to create a PHP DateTime instance of '2016.04.30 PM 7:30' via DateTime::createFromFormat?

我目前正在开发一个 Wordpress 项目,我应该在其中获取一些自定义 post 元数据,将其转换为 DateTime 实例,然后用它进行计算。

当我echo get_post_meta时,它看起来如下。

2016.04.30 PM 7:30

我用来获取 DateTime 实例的格式如下。

Y.m.d A g:i

但是DateTime::createFromFormat的return值为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.

我在这里错过了什么?我想这一定是一些微不足道的事情,但我无法通过。

更改日期格式并尝试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();
}

Supported date formats in PHP

测试,我发现格式中的问题字符是'A'。所以我四处寻找并发现了这个bug in PHP(这显然根本不是一个错误!)

经过 source code,它似乎要等到一个小时后才会解析 AM 和 PM。

最好的选择可能是快速通过正则表达式将 AM/PM 移动到末尾:

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