2011-04-27 160 views
2
<?php 
$first = '2011-04-27'; 
$second = '2011-04-27 16:20:12'; 
$third = '2011-04-27 16:20:12+00'; 

$dt = new DateTime($first); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 
// OK 
$dt = new DateTime($second); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 
// OK 
$dt = new DateTime($third); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 
// Error 
// ->getName() returns unexpectedly +00, which is not a name, but offset 

日期時間提取自最後一個字符串時區名稱+00,這實際上不是名稱,而是偏移因此無法設置爲時區...DateTime :: getTimezone不返回時區名稱,而是返回偏移量

這種行爲導致了麻煩(de )序列化DateTime對象...

public function __sleep() 
{ 
    $this->fix = array($this->format('Y-m-d H:i:s'), $this->getTimezone()->getName()); 
    return array('fix'); 
} 

public function __wakeup() 
{ 
    $this->__construct($this->fix[0], new DateTimeZone($this->fix[1])); 
    unset($this->fix); 
} 

我知道得到例如更好這個字符串:2011-04-27 16:20:12 UTC,無論如何,就metod被稱爲getName(),它不應該返回+00作爲名稱,還是應該?

回答

0

您試圖創建時區DateTime對象偏移+00,這就是爲什麼它返回偏移,而不是有效的時區標識符,實際上這意味着GMT+0000。使用不帶偏移量的日期時間字符串,您將根據DateTime對象(或系統)中的當前時區設置獲取PHP時區標識符。

隨着$third = '2011-04-27 16:20:12+00';你已經設置+00:00DateTime對象,而不是PHP標識符和DateTime偏移剛剛返回回來->getName()方法。

固定偏移量不提供有關DST規則的信息,因此它不能用於取回PHP TimeZone標識符。示例:在我的區域中,目前爲GMT+2(活動DST),但如果將它放入日期時間字符串中,DateTime對象無法知道我的偏移何時更改爲+1,只是它始終是GMT + 0200 ......就這些了。

偏移+00你的情況相符像Atlantic/ReykjavíkAfrica/CasablancaAfrica/Nouakchott了很多不同的時區標識符等

這就是爲什麼getName()方法返回時間偏移,而不是時區!

這不是官方的解釋,但這是它的簡短版本。

當然,2011-04-27 16:20:12+00是無效的日期時間字符串。

0

當我運行該代碼時,PHP表示它無法識別該格式(格式定義爲here),因此輸出是錯誤的結果。但是,我能夠像這樣運行:

$third = '2011-04-27 16:20:12 GMT'; 

$dt = new DateTime($third); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 

我想你可以只用GMT取代+00

+0

我可以寫一些代碼,它將取代+00 UTC或GMT,或者我可以設置數據庫來返回時區名稱,但這不是我的觀點......我的觀點是「爲什麼getName()方法返回偏移量「? – 2011-04-27 15:54:40

+0

Wh1T3h4Ck5說的是正確的,這是因爲'getName'函數無法解析您在PHP中定義的時區的偏移量。 – 2011-04-27 16:00:25

相關問題