如何格式化UTC日期以使用php中的Z(祖鲁语)区域指示符


How to format an UTC date to use the Z (Zulu) zone designator in php?

我需要以以下格式显示和处理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"附加到自定义时间格式?

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

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

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

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

如果您使用Carbon,则方法为:

echo $dt->toIso8601ZuluString();    
// 2019-02-01T03:45:27Z

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

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

要使用面向对象风格的日期对象,您需要首先将时区设置为UTC,然后输出日期:

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

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

由于引入了PHP 7.2 DateTimeInterface::ATOM以支持DateTimeInterface::ISO8601,尽管由于向后兼容性的原因,它仍然存在。

使用

$dateTimeObject->format(DateTimeInterface::ATOM)