2010-12-10 144 views
1

我遇到了一個我無法理解的愚蠢問題。 爲什麼認爲下面的代碼段:PHP - 奇怪的時區偏移

public function getFormattedOffsetFrom($refTimezoneId = 'Europe/Paris', $format = 'G\hi') { 
    $timestamp = time(); 
    $reference = new DateTime('@'.$timestamp); 
    $referenceTimeZone = new DateTimeZone($refTimezoneId); 
    $reference->setTimezone($referenceTimeZone); 
    $datetime = new DateTime('@'.$timestamp); 
    $datetime->setTimezone($this->timezone); 
    $offset = $this->timezone->getOffset($datetime) - $referenceTimeZone->getOffset($reference); 
    $prefix = '+'; 
    if($offset < 0) { 
     $prefix = '-'; 
     $offset = abs($offset); 
    } 
    return $prefix.date($format, $offset); 
} 

其中$這 - >時區是定位在歐洲/馬德里DateTimeZone的實例,產生+ 1h00時指定無參數????

巴黎和馬德里沒有時間抵消。我只是不明白。

非常感謝您的幫助! Florent

+0

啊,你正在比較巴黎*對馬德里,對不起,我沒有得到。你能輸出原始偏移量來看看有什麼不對嗎?這可能是 – 2010-12-10 20:39:19

+0

函數內部的一個錯誤,偏移量應該爲0 :) – Rolf 2010-12-10 20:41:04

+0

我認爲你必須調試該函數並查看它出錯的地方... – 2010-12-11 11:35:28

回答

2

爲什麼應該是0?西班牙和法國都使用GMT + 1作爲時區。

http://en.wikipedia.org/wiki/File:Time_zones_of_Europe.svg

的問題是,你正在試圖格式化$offset保存在幾秒鐘的時間差,用功能date(),其預計時間戳作爲第二個參數。如果$offset == 0date函數將其識別爲1970-01-01 00:00:00 GMT,因此在您的時區中,它將是1970-01-01 01:00:00 GMT + 1,並且您正在使用格式返回小時和分鐘,這就是爲什麼你有+1作爲輸出。

您必須手動格式化這樣這個時間差:

$offsetH = floor($offset/3600); //full hours 
$offsetM = floor(($offset - $offsetH)/60); //full minutes 

return sprintf("%s%sh%02s",$prefix,$offsetH,$offsetM) ; 
+0

他正在比較巴黎對*馬德里,我做了 – 2010-12-11 11:35:55

+0

謝謝,現在有道理;) – 2010-12-11 12:17:04

+0

哈哈哈,非常感謝您的幫助,確實有道理:) – Rolf 2010-12-11 13:03:23

1

的問題可以降低到date('G', 0)給「1」。解決方案是使用gmdate()