在PHP中如何根据ISO 8601日期时间和时区获取本地时间

3

我正在尝试获取一个ISO 8601格式的Zulu时间字符串和一个时区字符串的本地时间。我阅读了PHP文档中关于DateTime对象和DateTimeZone的内容,并尝试了很多方法,但似乎无法得到正确的本地时间。我目前的代码如下:

$datetime = '2017-05-29T10:30:00Z'; // I'm getting this value from an API call
$timezone = 'Europe/Prague'; // I'm getting this value from an API call
$date = new \DateTime( $datetime, new \DateTimeZone( $timezone ) );
var_dump( $date->format('H:i') );
// I would expect it to be 12:30 since 29th May for this timezone would be GMT+2, but I get 10:30

显然,我对DateTime和DateTimeZone类的某些地方存在疑惑,但我无法理解。有没有人能够帮助我?

3个回答

2

所以我终于搞定了,对于任何有兴趣的人:


$datetime = '2017-05-29T10:30:00Z'; // I'm getting this value from an API call
$timezone = 'Europe/Prague'; // I'm getting this value from an API call
$date = new \DateTime( $datetime, new \DateTimeZone( 'UTC' ) ); // as the original datetime string is in Zulu time, I need to set the datetimezone as UTC when creating
$date->setTimezone( new \DateTimeZone( $timezone ) ); // this is what actually sets which timezone is printed in the next line
var_dump( $date->format('H:i') ); // yay! now it prints 12:30

1

Try this code:

date_default_timezone_set("Europe/Prague");
echo date('H:i');

它将以24小时格式打印日期和时间。

date_default_timezone_set 可以用于在该时区中打印当前时间 (date('H:i')),但 $date->format('H:i') 的结果不会因此而修改。 - jorditarrida
这对我有用:date_default_timezone_set("Europe/Prague"); $datetime = date('Y-m-d').'T'.date('H:i:s').'Z'; $timezone = 'Europe/Prague'; $date = new \DateTime( $datetime, new \DateTimeZone( $timezone ) ); var_dump( $date->format('H:i') ); - Muhammad Athar
你正在尝试使用静态变量 $datetime = '2017-05-29T10:30:00Z';。由于变量中的时间是10:30,因此你的代码正在打印10:30。 - Muhammad Athar
我正在通过API调用获取此内容,因此无法更改它。我已更新问题以反映这一点。正如我在最初的问题中所述,我正在尝试从给定的ISO 8601字符串+时区获取本地时间,因此您的解决方案对我无效。 - jorditarrida

1

我认为困惑在于你所处的时区与日期时间字符串所处的时区不同。我在新奥尔良,所以我的时区是'America/Chicago'。我会使用以下设置:

date_default_timezone_set('America/Chicago');

然后,设置你的日期时间字符串所来自的时区(我假设是欧洲/布拉格):

$datetimePrague = '2017-05-29T10:30:00Z';
$timezonePrague = 'Europe/Prague';

现在,当您创建一个DateTime对象时,请将其传递给时间来自的日期时间和时区。
$datePrague = new \DateTime( $datetimePrague, new \DateTimeZone( $timezonePrague ) );

然后,获取DateTime对象的时间戳:
$timestamp = $datePrague->getTimestamp();

最后,将该时间戳传递给date()函数,再加上您所需的格式,就可以得到与您所在时区相等的DateTime的等效值:
date('H:i', $timestamp);

以下是完整代码,假设我住在新奥尔良,并且想知道当布拉格时间为10:30时,当地的新奥尔良时间是多少:

<?php

date_default_timezone_set('America/Chicago');

$datetimePrague = '2017-05-29T10:30:00Z';
$timezonePrague = 'Europe/Prague';
$datePrague = new \DateTime( $datetimePrague, new \DateTimeZone( $timezonePrague ) );
$timestamp = $datePrague->getTimestamp();
var_dump(date('H:i', $timestamp));

谢谢您提供如此详细的答案。实际上,我想获取本地时间:不是我的本地时间,而是根据$timezone定义的时区来确定的时间,因为原始日期时间字符串是在Zulu时间(即UTC),所以它不是本地时间->这是ISO 8601日期格式中的Z。虽然您的答案非常清晰和有帮助,但它并没有解决我的特定问题。最终我找到了解决方法并写了一个答案。尽管如此,我还是会给您的答案点赞,因为它非常详细和有帮助 :) - jorditarrida
好像我的声望不够,无法让我的点赞计入统计,但我还是给了它。再次感谢。 - jorditarrida
啊,我懂了,我想我有些困惑。我以为你的日期时间字符串来自欧洲/布拉格。很高兴你解决了它! - djs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接