2014-09-04 33 views
5

當使用PHP DateTime類並嘗試設置DateTimeZone時,根據我的設置,我得到了不同的結果:使用DateTime::__construct或使用DateTime::setTimezone方法。PHP日期時間時區 - 構造器vs安裝員方法

這裏有一個例子:

$date = '2014-08-01' 

$dateTimeOne = new DateTime($date, new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeOne->format('Y-m-d\TH:i:sP'); 
// 2014-08-01T00:00:00-07:00 

$dateTimeTwo = new DateTime($date); 
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeTwo->format('Y-m-d\TH:i:sP'); 
// 2014-07-31T17:00:00-07:00 

又見http://3v4l.org/LrZfM

我已經環顧四周,並沒有發現解決比php docs: datetime.settimezone和書下注釋等這些特殊的行爲充分的解釋php|architect's Guide to Date and Time Programming: Dealing with Timezones - DateTimeZone

該註釋指出,DateTime::setTimezone方法將更改特定時間點(時間戳)的時區,但Unix時間戳保持不變。

另一方面,DateTime::__construct DateTimeZone參數用於「用用戶定義的一個覆蓋當前的默認時區」Chapter 3: Dealing with Timezones - DateTimeZone

除了這些之外,關於這個主題(我能找到)沒有太多的東西。

這是我想知道的內容:

  • 的這兩種方式我應該使用DateTime::__construct當我應該使用設置時區
  • 設置時區
  • 進一步解釋DateTime::setTimezone設置時區
  • 使用一個vs另一個或如何使用它們的明顯示例
+2

在構造函數中有一個時區意味着'$ date'在該時區;設置時區會根據建築時區和給定時區之間的差異來移動日期。 – 2014-09-04 09:58:08

回答

1

這是正常行爲。

如果您未在構造函數中指定時區,則使用默認時區,即使用date_default_timezone_set()設置的時區。

當你再調用:

$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 

它移動的日期在默認的時區設置到新的時區。


1)(構造函數)在 '美國/洛杉磯'
2)(制定者設定的日期)的默認時區設置日期,搬遷日期爲 '美國/洛杉磯'


您的默認時區可能是UTC或接近的東西。你告訴計算機在UTC設置2014-08-01。然後,您要求切換到7小時前的'America/Los_Angeles'時區,因此在17:00將日期更改爲2014-07-31。