如何格式化UTC日期以在PHP中使用Z(Zulu)区域指示符?

时间:2013-06-30 13:22:06

标签: php datetime iso8601

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

6 个答案:

答案 0 :(得分:76)

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

为了以所需的格式获取UTC日期,可以使用以下格式:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

祖鲁时区(Z)与协调世界时(UTC)完全相同。有趣的是,PHP并未将“ Z”识别为有效的时区代码,尽管未在supported timezones中列出。

这允许利用内置的format character“ T”来动态呈现时区缩写,而不是硬编码的“ Z”后缀。

$zulu = $date->setTimeZone(new \DateTimeZone('Z'));
echo $zulu->format('Y-m-d\TH:i:sT');
// 2020-05-20T21:09:48Z

该示例假定\DateTimeImmutable实例已被时区设置器克隆,同时保持原始实例完整。

更新:最初,答案以内置常量\DateTime::RFC3339为特色,该常量依赖于格式字符“ P”而不是必需的“ T”使其不适合使用。诚然,该解决方案失去了吸引力,因为它现在需要像其他方案一样明确指定格式。