PHP时区Etc / GMT + 5变成-0500?

时间:2014-04-26 06:10:43

标签: php datetime timezone

与许多网络应用程序一样,我开发的应用程序需要为我们亲爱的最终用户转换时区。但是,当我在PHP 5.3中使用Carbon / DateTime时,我发现这很奇怪:

$date_str = '2014-04-15 12:00:00'; // from database

$date = new DateTime($date_str,new DateTimeZone('GMT'));
$date->setTimezone(new DateTimeZone('Etc/GMT+5'));

echo $date->format('Y-m-d H:i:s O'); // 2014-04-15 07:00:00 -0500

我将$date的时区设置为GMT + 5,但是当我格式化$date时,它变为-0500而不是预期的+0500

同样,如果我将其设置为否定,即Etc/GMT-5,则格式显示+0500而不是预期的-0500

任何能够启发的人吗?

我能够在PHP 5.3.3,5.3.13,5.3.28中复制这个问题。认为这是一个PHP特定版本的bug。错误或功能?

2 个答案:

答案 0 :(得分:7)

这是一个有趣的案例。 Etc/GMT时区的符号相反。

来自Wikipedia article on tz database

  

为了符合POSIX风格,那些以Etc/GMT开头的区域名称与大多数人的期望相反。在这种风格中,格林尼治标准时间以西的区域有一个正号,而东方区域的名称有一个负号(例如Etc/GMT-14比格林威治标准时间早14个小时。)

PHP manual还警告您不要使用此时区:

  

警告:请不要使用此处列出的任何时区(除了UTC),它们仅出于向后兼容的原因而存在。


使用特定的时区标识符,而不是使用偏移量。要获取有效时区列表,您可以使用print_r(DateTimeZone::listIdentifiers(DateTimeZone::ALL));

答案 1 :(得分:1)

我希望它可以帮到你

删除

其他/ GMT

使用gtm + offset

$date_str = '2014-04-15 12:00:00'; // from database

$date = new DateTime($date_str,new DateTimeZone('GMT'));
$date->setTimezone(new DateTimeZone('GMT+5'));

echo $date->format('Y-m-d H:i:s O'); 

输出2014-04-15 17:00:00 +0500