0

我目前正在尝试显示 10 个不同时区的当地时间,但我找不到任何解决我的问题的方法。

我正在使用这段代码:

$timezone = +12;
echo gmdate("Y/m/j H:i:s<br />", time() + 3600*($timezone + date('I'))); 

$timezone本地时间在哪里,取决于时区,可以是 、 或无+-我的问题是,有些国家有夏令时。我怎样才能让这段代码考虑到这一点并计算夏季/冬季?

4

2 回答 2

2

你不应该做这样的“手动”日期计算,PHP 有很好功能对于时区计算,请使用DateTimeZone

解决方案

虽然我不完全确定您希望实现什么,但您可以像这样在时区之间进行转换:

$fromTz = new DateTimeZone('GMT');
$toTz   = new DateTimeZone('Pacific/Midway');
$dt     = new DateTime('now', $fromTz);
$dt->setTimezone($toTz);
echo $dt->format('Y/m/j H:i:s');

背景

时区计算可能非常棘手,尤其是 - 正如您所注意到的 - 与夏令时 (DST) 结合使用。此外,每隔几年,一个国家/地区就会更改时区等。您也不应该忘记甚至适用于 UTC 的时间校正,以完全匹配行星的自转。

PHP 使用的时区数据记录了所有这些更改,并且可以精确地应用时区计算,这远远超出了您在编写自己的代码时所希望完成的工作。

有关为什么不应该使用时间戳进行时间计算的更多详细信息,请阅读我关于时间处理的博文

于 2013-06-19T07:53:38.863 回答
2

如前所述,您应该使用 PHP 的时间和日期函数,但重要的是 PHP 的日期/时间数据是最新的。

但是,PHP 的更新频率不如 Olson DB(用于时间和日期记录),因此仅使用 PHP 的时区转换可能会给您留下过时的 DST 信息,并影响数据的正确性。虽然预计这不会经常发生,但它可能会发生,并且如果您在全球拥有大量用户群,就会发生这种情况。

为了解决上述问题,有一个pecl 包可以更新 PHP 的 TimeZone 数据。安装这个包的频率和更新频率一样,你处于一个非常好的立场。

于 2013-06-19T08:06:39.627 回答