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
答案 0 :(得分:2)
这是一个php bug,自2008年以来显然仍然存在(!),当它第一次相关时(可能它的方式较旧)。
答案 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。