2013-10-21 32 views
0

我在PHP中有一個DateTime對象。那就是:轉換時區產生相同的時間戳

$base = new DateTime('2013-10-21 09:00', new DateTimeZone('America/New_York')); 

當我打電話$base->getTimestamp(),我得到的,符合市場預期:1382360400

在我的項目,我使用moment.js,當我告訴眼前這個時間戳是「本地時間」,它工作正常:

// Correct :) 
moment.unix(1382360400).local().format('LLLL') // Monday, October 21 2013 9:00 AM 

的問題是,在我的應用程序的所有其他日期都在UTC(除了這一個),所以在我的JavaScript代碼,我有這個:

var theDate = moment.unix(timestamp).utc(); 

對於所有其他日期,這個工程,但不是這一個。 1382360400處於「當地時間」,而不是UTC。我想通過電話setTimezone會修復,所以我做了$base->setTimezone(new DateTimeZone('UTC'));

調用var_dump($base)返回我:

object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2013-10-21 13:00:00" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(3) "UTC" 
} 

這看起來是正確的,但是當我做$base->getTimestamp(),我再次得到1382360400!那是不對的!我顯然沒有得到正確的日期。

// Incorrect :(
moment.unix(1382360400).utc().format('LLLL') // Monday, October 21 2013 1:00 PM 

我怎樣才能PHP的DateTime返回我的時間戳UTC?我期望從$base->getTimestamp()得到1382346000,這是我所得到的,當我做:

$UTC = new DateTime('2013-10-21 09:00', new DateTimeZone('UTC')); 
echo $UTC->getTimestamp(); 

那麼,如何將我的DateTime對象轉換爲UTC,並得到我想要的時間戳?

// Correct :) 
moment.unix(1382346000).utc().format('LLLL') // Monday, October 21 2013 9:00 AM 

(PHP演示:https://eval.in/56348

回答

1

時間戳沒有一個時區。 DateTime對象顯然內部存儲時間戳,而不是日期&時間。所以當你改變它的時區時,同樣的時間戳仍然存在,但你的日期&時間改變了。當你開始時,它是9個小時,改變時區後是13個小時。

+0

我想弄清楚如何「轉換」時間戳。我需要一個解決方案,或至少一個解決方法。 –

+1

您可以使用'DateTimeZone :: getOffset()'計算兩個時區的時區偏移量,從另一箇中減去一個,並將結果添加到時間戳中。 – morgoth84

+0

謝謝! '$ base-> getTimestamp()+ $ local_tz-> getOffset($ base);'返回給我'1382346000' :-D DEMO:https://eval.in/56365 –