我目前正在努力尝试显示10个不同时区的当地时间,但我无法找到解决问题的方法。
我正在使用此代码:
$timezone = +12;
echo gmdate("Y/m/j H:i:s<br />", time() + 3600*($timezone + date('I')));
其中$timezone
是当地时间,+
,-
或无,具体取决于时区。我的问题是,有些国家有夏令时间。如何将此代码考虑在内并计算夏季/冬季?
答案 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数据。按照更新的频率安装此软件包,您处于非常好的立场。