2012-03-01 71 views
1

我有一個腳本可以引入來自不同時區的RSS源。然後,我發佈了一個twitter樣式的時間顯示「發佈約10分鐘前」的RSS提要。但是因爲我無法將這些時間轉換爲GMT時區,所以此屏幕顯示的時間不正確,例如,來自EST的帖子總是在「大約5小時前」提出新帖時。在PHP中轉換時區

我環顧四周尋找解決方案,但他們都沒有爲我工作我不知道你是否可以告訴我我要去哪裏錯了。

$dbTimezone = new DateTimeZone($dbStoredTimezone); //$dbStoredTimezone = 'EST' 
$dbDate = new DateTime($dbStoredDate, $dbTimezone); //$dbStoredDate = '2012-03-01 05:27:26' 
$gmtTimezone = new DateTimeZone('GMT'); 
echo $gmtTimezone->getOffset($dbDate); //always echo's 0 
$offset = DateInterval::createFromDateString ($gmtTimezone->getOffset($dbDate)); 
$dbDate->add($offset); 
+0

在這裏閱讀紅色框:http://www.php.net/manual/en/timezones.others.php – KingCrunch 2012-03-01 11:13:08

+0

嗯,這可能是一個問題,因爲RSS提要pubDate使用EST的時區格式 – 2012-03-01 11:17:38

+0

仍然沒有改變當我硬編碼EST是美國/紐約和格林威治標準時間是歐洲/倫敦 – 2012-03-01 11:21:29

回答

1

這個問題似乎在你的$gmtTimezone = new DateTimeZone('GMT');。因爲getOffset()返回GMT的偏移量(請參見:http://www.php.net/manual/en/datetimezone.getoffset.php)。這正是爲什麼它總是返回0

如果您使用DateTime::getOffset()方法它應該工作。

這是你的編輯代碼:

<?php 
$dbTimezone = new DateTimeZone($dbStoredTimezone); //$dbStoredTimezone = 'EST' 
$dbDate = new DateTime($dbStoredDate, $dbTimezone); 
echo $dbDate->getOffset(); 
$offset = DateInterval::createFromDateString ($dbDate->getOffset()); 
$dbDate->add($offset); 

我的結果是-18000

+0

邪惡感謝很多老兄,就是這樣。我還必須改變我如何將DateInterval對象設置爲'$ offset = new DateInterval('PT'。str_replace(' - ','',$ dbDate-> getOffset())。'S');'。但我認爲這個解決方案雖然有點怪異 – 2012-03-01 12:40:36