我目前正在尝试显示10个不同时区的当地时间,我找不到任何解决我的问题的方法。
我使用这个代码:
$timezone = +12;
echo gmdate("Y/m/j H:i:s<br />", time() + 3600*($timezone + date('I')));
其中$timezone
为本地时间,根据时区选择+
、-
或不为。我的问题是,有些国家有夏令时。我怎样才能使这个代码考虑到这一点,并计算夏季/冬季?
如前所述,您应该使用PHP的时间和日期函数,但是重要的是PHP的日期/时间数据是最新的。
然而,PHP不像Olson DB(用于时间和日期记录)那样频繁更新,因此仅使用PHP时区转换可能会给您留下过时的DST信息,并影响数据的正确性。虽然预计这种情况不会经常发生,但如果您在全球拥有大量用户,则可能会发生这种情况。
为了解决上述问题,有一个pecl包可以更新PHP的时区数据。经常安装这个包,因为它更新,你在一个非常好的立场。
你不应该做这样的"手动"日期计算,PHP有非常好的函数。对于时区计算,使用DateTimeZone。
<<p> 解决方案/strong>虽然我不完全确定您希望实现什么,但您可以像这样在时区之间进行转换:
$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使用的时区数据记录了所有这些更改,并且可以精确地应用时区计算,这比您编写自己的代码时希望完成的要多得多。
关于为什么不应该使用时间戳进行时间计算的更多细节,请阅读我关于时间处理的博文