2016-11-09 22 views
3

等於作爲PHP 5.2.2的,比較使用比較運算符datetime對象被支撐。PHP datetime對象不具有修飾的時區

5.2.2 DateTime對象與比較運算符的比較已更改爲按預期工作。以前,所有的DateTime對象都被認爲是相等的(使用==)。

我的問題是,當我修改現有DateTime對象的時區,它不再等於DateTime對象,它等於更改時區之前。 Weirder仍然是,如果我在修改的DateTime對象上調用DateTime :: getTimestamp(),它現在將等於另一個DateTime對象。

例如:

<?php 

$dt = new DateTime("2016-11-08 08:27:33am -08"); 
$dt2 = new DateTime("2016-11-08 09:27:33am -07"); 

var_dump($dt == $dt2); 

$dt2->setTimezone(new DateTimeZone("-08")); 

var_dump($dt == $dt2); 
var_dump($dt < $dt2); 
var_dump($dt > $dt2); 

var_dump($dt2->getTimestamp()); 

var_dump($dt == $dt2); 
var_dump($dt < $dt2); 
var_dump($dt > $dt2); 

將產生以下的輸出:

bool(true) 

bool(false) 
bool(false) 
bool(true) 

int(1478622453) 

bool(true) 
bool(false) 
bool(false) 

那麼是什麼原因?如您所見,$dt$dt2在創建時是相等的,儘管它們位於不同的時區。不過,這種行爲是可以預料的。 $dt$dt2都代表完全相同的時間。如果您在他們兩個上撥打getTimestamp(),您將獲得相同的號碼。同樣,如果您明確設置兩個日期時間的時區,它們將相等。

PHP手冊確實是時區被忽略的狀態,如果初始化字符串包含一個時區(或者是Unix時間戳):

注: 在$時區參數和當前時區都被忽略了$時時間參數是UNIX時間戳(例如@ 946684800)或指定時區(例如2010-01-28T15:00:00 + 02:00)。

所以我相信這是看似不規則的行爲的原因,但我不介意知道爲什麼。

因此,沒有任何人有任何想法,爲什麼DateTime是否這樣的表現? DateTime對象實際上與相比如何?如果您仍然需要將它與另一個DateTime對象進行比較,那麼更改DateTime對象的時區的最佳方法是什麼?

+0

即使creepier:-S http://pastebin.com/b8VXm5dG – DanFromGermany

+2

看起來像我的錯誤。報告。請注意,'-08'不是一個真正的時區。如果您使用實時時區,也許您可​​以獲得更好的結果。 – Evert

+0

雖然偏移確實不是實時時區,但PHP的文檔__不會顯示_以指示它是否支持偏移。我可以在這個實現中使用確切的時區。不幸的是,在這種情況下是不可能的。這個代碼如下: '<? var_export($ dt);' 將顯示時區爲「-08:00」。 – landon

回答

0

這是php bug。要解決此您可以擴展DateTime類,並覆蓋setTimezone方法是這樣的:

class MyDateTime extends DateTime { 
     public function setTimezone($timezone) { 
      parent::setTimezone($timezone); 
      $this->getTimestamp(); 
      return $this; 
     } 
    } 
相關問題