如何使用 PHP 显示 ISO 8601格式的日期

我试图用 PHP 将 MySQL 数据库中的日期时间显示为 ISO 8601格式的字符串,但结果是错误的。

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

这是我正在使用的代码:

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

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

知道出什么问题了吗?

139753 次浏览

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

您需要使用 再见转换数据库时间戳。

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

在 PHP 5之前:

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

下面是 PHP5前的好函数: 我在最后加入了 GMT 差异,它不是硬编码的。

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

使用 PHP 版本5.2中的 日期时间类可以这样做:

$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)你也可以使用 'Y-m-d\TH:i:sP'作为 'c'的替代格式。

2)输入的默认时区是服务器的时区。如果希望输入的时区不同,则需要显式地设置时区。然而,这也会影响你的产出:

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

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

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

四个或八个决赛中,这个问题多次出现在毫秒和最后的微秒中。为了转换 日期为 ISO8601 日期(DATE _ ISO8601)这些是我的解决方案之一:

// In this form it leaves the date as it is without taking the current date as a reference
$dt = new DateTime();
echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z';
// return-> 2020-05-14T13:35:55.191Z


// In this form it takes the reference of the current date
echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z');
return-> 2020-05-14T13:35:55.191Z


// Various examples:
$date_in = '2020-05-25 22:12 03.056';
$dt = new DateTime($date_in);
echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z';
// return-> 2020-05-25T22:12:03.056Z


//In this form it takes the reference of the current date
echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z',strtotime($date_in));
// return-> 2020-05-25T14:22:05.188Z