2016-12-03 82 views
0
的時區工作

我UTC格式存儲日期在數據庫中,還用戶有時間偏移如何糾正澳大利亞

這裏是我的代碼

$this->timezoneName = timezone_name_from_abbr("", 10 * 3600, 0); 
$d = new \DateTime($date); 
$d->setTimezone(new \DateTimeZone($this->timezoneName)); 
return $d->format("d.m.Y H:i"); 

所有工作正確的,對於任何$ 0偏移到+9,但爲+10(澳大利亞)它返回日期偏移+11而不是+10 如何解決它?

更新 - 這裏是更正確的代碼

$this->timezoneName = timezone_name_from_abbr("", $offset * 3600, 0); 
$d = new \DateTime('8.11.2016 10:00:00', new \DateTimeZone('UTC')); 
    $d->setTimezone(new \DateTimeZone($this->timezoneName)); 
return $d->format("d.m.Y H:i"); 

我得到2016年8月11日21:00

+0

尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)。 –

+0

澳大利亞目前GMT + 11(至少在Caberra)。 –

+1

當然,澳大利亞不僅有一個時區。在阿德萊德,時區爲格林威治標準時間+10.5分,柏斯時區格林威治標準時間+8分。這個問題太廣泛了。 –

回答

1

調用timezone_name_from_abbr("", 10 * 3600, 0)回報Australia/Melbourne

墨爾本開始夏令時(又名「夏令時」)on October 2, 2016。它將生效until April 2, 2017

在標準時間,墨爾本是UTC + 10。在夏令時期間,墨爾本的UTC + 11。這解釋了你的結果。

一般來說,不要使用固定的偏移量,因爲它們不能解釋DST和其他歷史差異。改用已命名的標識符。

+0

謝謝,但我需要沒有DST的時間,所以出於這個原因我使用固定偏移量。 DateTime如何實現? – kusanagi

+0

好吧,如果你必須的話,你可以使用像'Etc/GMT-10'這樣的區域,它可以用於全時區,主要用於海上的船隻。首先試圖忽略DST並不是一個好主意。 DST是實際如何設置時鐘的一部分。如果您使用這些區域,請記住,區域名稱中的偏移將使其符號反轉。 –

相關問題