2011-03-18 23 views
0

任何想法,爲什麼以下:DateTime和DateTimeZone的正確用法是什麼?

$objTimeZone = new DateTimezone("Europe/London"); 

$objDateFrom = new DateTime(null); 
$objDateFrom->setTimezone($objTimeZone); 
$date_from = $objDateFrom->format('c'); 

$objDateTo = new DateTime(strtotime("2011-05-04 19:30:00 - 24 hour")); 
$objDateTo->setTimezone($objTimeZone); 
$date_to = $objDateTo->format('c'); 

會給我爲$ date_from如下:

2011-03-18T14:34:19 + 00:00

這似乎很好,以下爲$ date_to - 這顯然是錯誤的:

1000-03-18T 13:04:45 + 00:00

+3

你的語法錯了,用'format('c:');'代替!開玩笑:) – 2011-03-18 14:40:01

回答

3

DateTime不接受UNIX時間戳作爲其第一個構造函數參數。它反而期望像strtotime()那樣的字符串。所以,你的代碼應該閱讀:

$objTimeZone = new DateTimezone("Europe/London"); 

// ... 

$objDateTo = new DateTime("2011-05-04 19:30:00 - 24 hour"); 
$objDateTo->setTimezone($objTimeZone); 
$date_to = $objDateTo->format('c'); 

要使用時間戳使用DateTime你必須先用@時間戳:

$ts = time(); 
$dt = new DateTime('@'.$ts); 

順便說一句:你必須要小心的方式您正在創建DateTime對象並應用時區。您正在創建的默認時區的DateTime對象(通過php.ini或通過date_default_timezone_set()設置,那麼在應用Europe/London時區到這個DateTime對象實際上是:取的時間點2011-05-04 19:30:00 - 24 hour在我的默認配置時區和然後我們想知道這個時間點是在Europe/London時區的時間。有,如果你配置的時區沒什麼區別,其實是Europe/London,但它可能是一個區別,如果該時區不同。

編輯(以舉個例子)

您的系統配置了默認時區UTC

$date1 = new DateTime(); // the null doesn't matter 
// $date1 now contains approx. 2011-03-18T15:03:58+00:00 
$date1->setTimezone(new DateTimezone('Europe/London'); 
// $date1 doesn't change because UTC is the same as Europe/London for the given date 
$date1->setTimezone(new DateTimezone('Europe/Berlin'); 
// in Germany the same point in time is 2011-03-18T16:03:58+01:00 

到目前爲止沒有問題。讓我們來看你的第二次約會。

$date2 = new DateTime("2011-05-04 19:30:00 - 24 hour");  
// $date2 now contains 2011-05-03T19:30:00+00:00 
$date2->setTimezone(new DateTimezone('Europe/London'); 
// $date2 now changes to 2011-05-03T20:30:00+01:00 because Europe/London moves to DST on March 27th 
$date2->setTimezone(new DateTimezone('Europe/Berlin'); 
// that's 2011-05-03T21:30:00+02:00 in Germany 

鋤頭,清理那一個。

+0

@Stefan Gehrig:很好地解釋,+1。 – 2011-03-18 14:45:06

+0

感謝Stefan - 我已根據您的指示修改了代碼,但現在我得到以下結果:$ date_from:2011-03-18T14:44:51 + 00:00/$ date_to:2011-05-03T20: 30:00 + 01:00 - 你可以看到$ date_to有不同的時區 - 即使你使用同一個 - 任何想法? – user398341 2011-03-18 14:45:33

+0

我使用:date_default_timezone_set('UTC');在配置中,然後運行上面的代碼。我的服務器位於「歐洲/倫敦」時區,但並非所有事件都是 - 這就是爲什麼我需要爲這兩個日期定義時區以將它們傳遞給PayPal。我不認爲我完全理解「順便說明」部分所說的內容 - 如果您要手動定義時區,它應該可行 - 對嗎?事實是,即使你我在兩個歐洲/倫敦時區使用 - 我得到$ date_to的差異-01:00(我目前的結果是:2011-03-18T15:01:10 + 00: 00> 2011-05-03T19:30:00 + 01:00) – user398341 2011-03-18 14:58:04

相關問題