2014-04-26 41 views
4

與許多網絡應用程序一樣,我正在開發的應用程序需要爲我們親愛的最終用戶轉換時區。然而,正如我在PHP 5.3與碳/日期時間的工作,我發現這個奇怪:PHP時區等/ GMT + 5變成-0500?

$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特定版本的錯誤。一個錯誤或功能?

回答

6

這是一個有趣的案例。 Etc/GMT時區的符號相反。

Wikipedia article on tz database

爲了與POSIX風格接軌,與Etc/GMT開始這些區域名稱從大多數人希望他們的標誌反轉。在這種風格,GMT以西的地區有積極的跡象,那些東在他們的名字有一個負號(如Etc/GMT-14超前/ GMT以東14小時。)

PHP manual也警告你不要使用此時區:

警告:請不要使用任何這裏列出(除了UTC)的時區,他們只存在向後兼容的原因。


代替使用偏置的,使用特定時區標識符。要獲取有效時區列表,可以使用print_r(DateTimeZone::listIdentifiers(DateTimeZone::ALL));

+0

'新的DateTimeZone('GMT + 5')'拋出'未知或不好的時區(GMT + 5)'異常。但是,感謝* tz數據庫*的解釋! – mauris

+1

@mauris:適用於我的本地系統,不知道爲什麼。我覺得這不是正確的做法。無論哪種方式,而不是使用偏移量,嘗試使用特定的時區。這可能會起作用。 –

+0

我將繼續存儲時區標識符,例如「歐洲/倫敦」在我的數據庫設置轉換然後。感謝您的輸入! – mauris

0

我希望它幫你

只是刪除

等/ GMT

與GTM +偏移

$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年4月15日17:00:00 0500