PHP显示本地时间(静态)并考虑夏季/冬季

时间:2013-06-19 07:47:01

标签: php timezone localtime

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

我正在使用此代码:

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

其中$timezone是当地时间,+-或无,具体取决于时区。我的问题是,有些国家有夏令时间。如何将此代码考虑在内并计算夏季/冬季?

2 个答案:

答案 0 :(得分:2)

您不应该像这样进行“手动”日期计算, PHP非常好functions 。对于时区计算,请使用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使用的时区数据包含所有这些更改的记录,并且可以精确地应用时区计算,这比编写自己的代码时希望完成的要多得多。

详细了解为什么不应该使用时间戳进行时间计算,请阅读my blogpost about time handling

答案 1 :(得分:2)

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

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

为了解决上述问题,有一个pecl package将更新PHP的TimeZone数据。按照更新的频率安装此软件包,您处于非常好的立场。