通过 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();
}
测试,我发现格式中的问题字符是'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);
我目前正在开发一个 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();
}
测试,我发现格式中的问题字符是'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);