是否可以将正常日期转换为ISO 8601时间格式?

问题描述:

我试图把这种类型的日期格式:是否可以将正常日期转换为ISO 8601时间格式?

周四,2011年11月10日在下午10时37

为ISO 8601格式(与PHP)。我怎样才能做到这一点?我已经试过:

date("c", $row2['time']) 

很显然,这是不正确的,因为TIMEAGO jQuery插件是说“41年前”,这绝对不是41年前。

是不可能将这种日期转换成ISO 8601格式?

我试图寻找这一点,我还没有找到如何把这种格式成为ISO 8601

+0

您应该将其存储为UTC时间戳,以便您以此方式使用它。 – *Pancake

+0

jQuery?这与PHP有什么关系? – mc10

+0

@ mc10 - 我正在使用jQuery插件将日期变成“3分钟前”等,因此用户更容易理解。但它必须采用ISO 8601格式才能正常工作。 – Nathan

您可以使用DateTime对象,可能与DateTime::createFromFormat,或strtotime创建的任何解决方案:

<?php 
date_default_timezone_set('America/New_York'); 
$date = 'Thursday, November 10th, 2011 at 10:37 PM'; 
$date = str_replace('at', '', $date); 
echo date("c", strtotime($date)); 

Demo

编辑:下面是使用对象日期时间的例子。请注意,对于这两个示例,您应该从valid timezone strings列表中设置一个正确的时区。

$date_obj = DateTime::createFromFormat('l, F jS, Y \at h:i A', 'Thursday, November 10th, 2011 at 10:37 PM', new DateTimeZone('America/New_York')); 
echo $date_obj->format('c'); 

Demo

+3

+1击败我的'createFromFormat()'示例 – Phil

+0

感谢您的详细解答和演示:) – Nathan

+0

如果月份的数字没有“th”,会发生什么?它会继续正常工作吗? – Nathan

尝试

$date = date('c', strtotime(str_replace(' at ', ' ', 'Thursday, November 10th, 2011 at 10:37 PM'))); 
echo $date; 

strtotime解析你的字符串,并将其转换为Unix时间戳。 date然后将您的日期格式化为ISO 8601日期。

+2

这会为我返回'1970-01-01T10:00:00 + 10:00'。 – F21

+0

'strtotime'窒息当我遇到'at' – nickb

+0

是的,我试过了,这可能是41年前的原因。 – Nathan