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

返回2014-06-26 06:30:00新加坡時區的問題和+08:00提供不同的答案

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

返回正確的答案 - 2014-06-26 06:00:00

http://phpepl.cloudcontrolled.com/

有沒有人知道爲什麼?

我得到我的服務器上被轉換爲UTC,並使用PHP 28年3月5日

+0

@ 1nflktd哦lols很好的抓住!似乎仍然是1年前破碎和5.3.3 ..任何想法,如果它固定在後面的?這怎麼還沒有解決!!!!!你想把它作爲答案嗎?我會接受 –

+1

http://en.wikipedia.org/wiki/Singapore_Standard_Time看來,直到1981年,SGT是+730,不知道這是否是問題..如果是的話......錯誤多大:P –

+0

好吧一個臭蟲然後:) –

回答

1

幾件事情:

  • 是,1nflktd的答案是正確的(並應繼續接受的答案)。 PHP中有一個錯誤。

    嗯,它不是一個「缺陷」作爲設計缺陷。當傳遞到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。

+0

哦,很酷,不知道abt'gmdate'。至於php repl時區,我明白那不是在UTC,那是我特別談論了30分鐘差異,而不是絕對偏移本身。 –

+0

這可能是一個設計缺陷,但它也是一個錯誤,因爲現在SGT是明確的+800 .... –

+0

HOLY CRAP ON A CRACKER ..剛剛看到這個:D:D「\t {」sgt「,0,27000, 「亞洲/新加坡」}, {「sgt」,0,28800,「亞洲/新加坡」},「顯然新加坡在那裏兩次! –

相關問題