如何使用PHP显示date为iso 8601格式

我试图从我的MySQL数据库中显示一个date时间作为一个ISO 8601格式与PHPstring,但它出错了。

2008年10月17日出现:1969-12-31T18:33:28-06:00这显然是不正确的(年份应该是2008年不是1969年)

这是我正在使用的代码:

<?= date("c", $post[3]) ?> 

$post[3] is the datetime (CURRENT_TIMESTAMP)我的MySQL数据库$post[3] is the datetime (CURRENT_TIMESTAMP)

任何想法出了什么问题?

date的第二个参数是UNIX时间戳,而不是数据库时间戳string。

你需要用strtotime转换你的数据库时间戳。

 <?= date("c", strtotime($post[3])) ?> 

使用PHP版本5.2中提供的DateTime类可以这样做:

 $datetime = new DateTime('17 Oct 2008'); echo $datetime->format('c'); 

看到它的行动

从PHP 5.4开始,您可以将其作为一个单行的内容:

 echo (new DateTime('17 Oct 2008'))->format('c'); 

程序风格:

 echo date_format(date_create('17 Oct 2008'), 'c'); // Output : 2008-10-17T00:00:00+02:00 

面向对象的风格:

 $formatteddate = new DateTime('17 Oct 2008'); echo $datetime->format('c'); // Output : 2008-10-17T00:00:00+02:00 

混合1:

 echo date_format(new DateTime('17 Oct 2008'), 'c'); // Output : 2008-10-17T00:00:00+02:00 

混合2:

 echo date_create('17 Oct 2008')->format('c'); // Output : 2008-10-17T00:00:00+02:00 

备注:

1)您也可以使用'Ymd\TH:i:sP'替代'c'作为格式。

2)input的默认时区是服务器的时区。 如果您希望input是针对不同的时区,则需要明确设置您的时区。 这也会影响你的输出,但是:

 echo date_format(date_create('17 Oct 2008 +0800'), 'c'); // Output : 2008-10-17T00:00:00+08:00 

3)如果您希望输出的时区与您input的时区不同,可以明确设置您的时区:

 echo date_format(date_create('17 Oct 2008')->setTimezone(new DateTimeZone('America/New_York')), 'c'); // Output : 2008-10-16T18:00:00-04:00 

预先PHP 5:

 function iso8601($time=false) { if(!$time) $time=time(); return date("Ymd", $time) . 'T' . date("H:i:s", $time) .'+00:00'; } 

这里是PHP5之前的好function:我在最后添加了GMT差异,它没有硬编码。

 function iso8601($time=false) { if ($time === false) $time = time(); $date = date('Ymd\TH:i:sO', $time); return (substr($date, 0, strlen($date)-2).':'.substr($date, -2)); }