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

mau*_*ris 5 php timezone datetime

与许多网络应用程序一样,我正在开发的应用程序需要为我们亲爱的最终用户转换时区.但是,当我在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
Run Code Online (Sandbox Code Playgroud)

我把$date时区设置为GMT + 5,但是当我格式化时$date,它变成-0500了预期的+0500.

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

有人能开导吗?

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

Ama*_*ali 7

这是一个有趣的案例.该Etc/GMT时区有自己的标志反转.

来自关于tz数据库维基百科文章:

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

PHP手册也提醒您不要使用这个时区:

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


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