2016-04-22 57 views
6

我目前正在研究一个Wordpress项目,在那里我应该得到一些自定义的发布元数据,将其转换为DateTime实例,并对其进行数学运算。什么是通过DateTime :: createFromFormat创建'2016.04.30 PM 7:30'的PHP DateTime实例的正确格式?

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

2016年4月30日下午7:30

格式我用得到一个DateTime实例如下。

Y.m.d甲克:ⅰ

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

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

回答

3

测试,我发现,在格式问题字符是'一个'。所以我戳了一下,发现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", "$1 $3 $2", $thedate); 
$start_at = DateTime::createFromFormat('Y.m.d g:i A', $thedate); 
1

改变日期格式,并尝试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

+0

不要忘记改变从''年月日A G格式字符串:我''到''Ymd g:我A''在你的例子中。 –