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

sal*_*igy 39 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
Run Code Online (Sandbox Code Playgroud)

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

hek*_*mgl 85

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

$date->format('Y-m-d\TH:i:s\Z');
Run Code Online (Sandbox Code Playgroud)

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

  • @MattJohnson这取决于.如果时间字符串被解释为UTC(但不包含字面意义上的偏移量)并且您的服务器具有与UTC不同的时区,则`setTimeZone()`将更改时间字符串的字面值.这可能不是你想要的.另一方面,如果要在服务器的时间内解释现有的时间戳,并且*希望*将它们转换为UTC时间,那么需要`setTimeZone()`. (2认同)

And*_*eKR 26

PHP 8p中添加了格式字符:

$timestamp = new DateTimeImmutable('2013-06-28T22:15:00Z');
echo $timestamp->format('Y-m-d\TH:i:sp');
// 2013-06-28T22:15:00Z
Run Code Online (Sandbox Code Playgroud)


Edm*_*nok 8

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

echo $dt->toIso8601ZuluString();    
// 2019-02-01T03:45:27Z
Run Code Online (Sandbox Code Playgroud)

  • 我需要参数“毫秒”来通过验证“echo $dt->toIso8601ZuluString('毫秒');” // 2020-11-30T10:12:00.000Z` (6认同)

Chr*_*ert 6

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

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

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

  • 如果您使用 **DateTime 类**,您可能需要在设置时区之前克隆对象,以防止更改原始对象。 (3认同)

Ynh*_*key 5

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

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