63

我需要以下列格式显示和处理 UTC 日期:

2013-06-28T22:15:00Z

由于这种格式是 ISO8601 标准的一部分,因此我可以毫不费力地从上面的字符串创建 DateTime 对象。但是我找不到一种干净的方式(意味着没有字符串操作,如 substr 和 replace 等)以所需的格式呈现我的 DateTime 对象。我试图调整服务器和 php 日期时间设置,但收效甚微。我总是得到:

$date->format(DateTime::ISO8601); // gives 2013-06-28T22:15:00+00:00

是否有任何日期格式或配置设置可以为我提供所需的字符串?或者我必须手动将“Z”附加到自定义时间格式?

4

5 回答 5

112

不,所需格式没有特殊常量。我会使用:

$date->format('Y-m-d\TH:i:s\Z');

但是您必须确保您使用的时间确实是 UTC,以避免应用程序中的解释错误。

于 2013-06-30T13:26:31.797 回答
11

如果您使用的是 Carbon,那么方法是:

echo $dt->toIso8601ZuluString();    
// 2019-02-01T03:45:27Z
于 2020-01-13T09:32:06.770 回答
8

为了获得所需格式的 UTC 日期,您可以使用以下内容:

gmdate('Y-m-d\TH:i:s\Z', $date->format('U'));
于 2019-04-15T08:13:24.880 回答
7

PHP 8中添加了格式字符p

$timestamp = new DateTimeImmutable('2013-06-28T22:15:00Z');
echo $timestamp->format('Y-m-d\TH:i:sp');
// 2013-06-28T22:15:00Z
于 2021-04-11T13:16:39.567 回答
5

要使用面向对象样式的日期对象执行此操作,您需要首先将时区设置为 UTC,然后输出日期:

function dateTo8601Zulu(\DateTimeInterface $date):string {
  return (clone $date)
    ->setTimezone(new \DateTimeZone('UTC'))
    ->format('Y-m-d\TH:i:s\Z');
}

编辑:在更改时区之前克隆对象。

于 2019-08-29T00:52:59.837 回答