2013-03-31 199 views
1

開始學習有關php dateTime & dateTimezone對象。假設美國/東部的服務器在另一個時區創建一個時間,目標是在服務器時間內將時間(即倫敦)轉換並存儲在服務器上(美國/東部)。使用此代碼:如何計算正確的偏移量?

$runTime = '2013-04-10 07:45:00'; 
$serverTimezone = new DateTimeZone ('US/Eastern'); 
$checkinTimezone = new DateTimeZone ('Europe/London'); 
$checkinTime = new DateTime ($runTime, $serverTimezone); 

$offset = $serverTimezone -> getOffset ($checkinTime); 

echo "<br/><pre>"; 
echo 'London: ' . date ('Y-m-d H:i', $checkinTime -> format ('U')) . "<br/>"; 
echo "<br/>offset: " . $offset . "<br/>"; 
echo 'Local: ' . date ('Y-m-d H:i', $checkinTime -> format ('U') + $offset); 

-14400總是在今天之前或之後(今天早些時候歐洲轉換爲DST)返回。在啊哈的時刻,我發現getOffset的說明文件爲Returns the timezone offset from GMT

有沒有簡單的方法將時間轉換爲US/Eastern?我是否必須進入getTransitions,查找DST開始的日期並手動進行計算?這隻在每個春季/秋季開關的第一天就很重要。

+2

你總是想成爲無知服務器的時區。從UTC時間開始,然後轉換爲目標時區。我不是PHP開發人員,所以我不能提供編碼解決方案,但這是一般時區的最佳實踐。 –

+0

@MattJohnson偉大的想法開始W/UTC和轉換。這在很大程度上是個問題...... – David

回答

0
$fromZone = new DateTimeZone('US/Eastern'); 
$toZone = new DateTimeZone('UTC'); // assuming the server is going to be UTC going forwards 

$dt = new DateTime('2013-04-02 10:00:00', $fromZone); 
$dt->setTimezone($toZone); 
echo $dt->format('Y-m-d H:i:s'); 

輸出:2013-04-02 14:00:00

根據需要切換時區。


如果你正在處理的只是時間戳,您可以在一定程度簡化事情:

$fromZone = new DateTimeZone('US/Eastern'); 
$dt = new DateTime('2013-04-02 10:00:00', $fromZone); 
echo $dt->getTimestamp(); 

輸出:1364911200