PHP,SGT和+08:00的新加坡时区问题提供了不同的答案

时间:2014-06-20 16:32:58

标签: php datetime timezone strtotime

echo date('Y-m-d H:i:s', strtotime("2014-06-26 12:00:00 SGT"));

返回2014-06-26 06:30:00

echo date('Y-m-d H:i:s', strtotime("2014-06-26 12:00:00 +08:00"));

返回正确答案 - 2014-06-26 06:00:00

on http://phpepl.cloudcontrolled.com/

有人知道为什么吗?

我的服务器上遇到类似的问题,转换为UTC,并使用PHP 5.3.28

2 个答案:

答案 0 :(得分:2)

这是一个php bug,自2008年以来显然仍然存在(!),当它第一次相关时(可能它的方式较旧)。

https://bugs.php.net/bug.php?id=45081

答案 1 :(得分:1)

有几件事:

  • 是的,1nflktd的答案是正确的(并且应该仍然是接受的答案)。 PHP中有一个错误。

    嗯,这不是一个" bug"作为设计缺陷。如果时区缩写包含在传递给strtotime的字符串中,则会通过a hardcoded list解析。这是有问题的,因为many time zone abbreviations are not unique,但也有许多人随着时间的推移改变了他们的定义。对于有问题的日期,硬编码的偏移量可能不正确。

    正如Karthik在评论中指出的那样,SGT曾经是UTC + 7:30,而不是现在的UTC + 08:00。这实际上发生在1982年 - as seen in the time zone data

    如果可能,您应该避免将时区缩写传递给strtotime

  • 我注意到你的结果已经过了两个小时。这是因为您引用的PHP repl站点上的时区是Europe/Berlin,对于相关日期,它在UTC + 02:00。因此SGT+08:00正在应用,但答案正在转换为柏林时间。

    您应该考虑使用date_default_timezone_set设置本地时区。

  • 如果您尝试转换为UTC(GMT),可以使用gmdate,如下所示:

    date_default_timezone_set("Asia/Singapore");
    echo gmdate('Y-m-d H:i:s', strtotime("2014-06-26 12:00:00"));
    

    输出:2014-06-26 04:00:00,这是正确的,因为4 + 8 = 12。