2011-04-27 118 views
17

服務器環境PHP UTC到當地時間

紅帽企業Linux
PHP 5.3.5

問題

比方說,我有一個UTC日期和時間,例如2011-04 -27 02:45我想 將它轉換爲當地時間,即America/New_York。

三個問題:

1)我下面的代碼可能會解決這個問題,你會同意嗎?

<?php 

date_default_timezone_set('America/New_York'); // Set timezone. 

$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

// Timezone offset in seconds. The offset for timezones west of UTC is always negative, 
// and for those east of UTC is always positive. 
$offset = date("Z"); 

$local_ts = $utc_ts + $offset; // Local Unix timestamp. Add because $offset is negative. 

$local_time = date("Y-m-d g:i A", $local_ts); // Local time as yyyy-mm-dd h:m am/pm. 

echo $local_time; // 2011-04-26 10:45 PM 

?> 

2.)但是,$ offset的值會自動調整爲夏令時(DST)嗎?
3.)如果不是,我應該如何調整我的代碼以自動調整DST?

謝謝:-)

+2

你試過了嗎? – wallyk 2011-04-27 15:26:14

+0

'date(「Z」)'總是返回時區'GMT + 0000',它沒有DST修正。 – 2011-04-27 15:37:12

回答

32

這會做你想要使用PHP的原生DateTimeDateTimeZone類的內容:

$utc_date = DateTime::createFromFormat(
       'Y-m-d G:i', 
       '2011-04-27 02:45', 
       new DateTimeZone('UTC') 
); 

$nyc_date = $utc_date; 
$nyc_date->setTimeZone(new DateTimeZone('America/New_York')); 

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM 

更多信息請參見DateTime::createFromFormat man page

經過time zones that do and do not currently have DST之間的一些實驗後,我發現這將考慮到DST。使用上述方法進行的相同轉換會導致相同的結果時間。

+1

這也是爲什麼PHP有7個不同的時區用於印第安納州,以說明他們所有瘋狂的不同DST規則:http://php.net/manual/en/timezones.php – 2011-04-27 16:28:16

+0

All:我真的很感謝大家的幫助。 Treffynnon:謝謝!我會試一試。我的代碼看起來很原始,與你相比,哈哈。我的嘗試是否接近?再次感謝! – John 2011-04-27 16:35:00

+0

@John很高興你喜歡它。我不確定你的代碼,因爲我從來沒有用程序化的PHP風格這樣寫過代碼。 – Treffynnon 2011-04-27 16:39:32

0
date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

就在執行此之後,$ utc_ts包含本地時間。 PHP處理DST本身。

= H =

+1

這不會轉換時區之間的時間。它只是爲'2011-04-27 02:45'創建一個新的unix時間戳。你的例子中的時區在這種情況下什麼也不做,並且是無關緊要的。 – Treffynnon 2011-04-27 15:56:44

+2

沒有像UTC時間戳這樣的事情,因爲時間戳不受時區影響。您可以在第一行設置任何時區,$ utc_ts將返回相同的值。此代碼除了設置時區以供將來在腳本中使用外,不會影響時間戳本身。 – Wh1T3h4Ck5 2011-04-27 17:06:18

3

我知道這是一箇舊帖子,但是您需要添加另一行以獲得正確的時間。

之前轉換爲本地時間,您需要將默認時區設置爲UTC這樣的(如果是您所提供的時間的時區):我會提高HASIN

function GmtTimeToLocalTime($time) { 
    date_default_timezone_set('UTC'); 
    $new_date = new DateTime($time); 
    $new_date->setTimeZone(new DateTimeZone('America/New_York')); 
    return $new_date->format("Y-m-d h:i:s"); 
} 
0

Hayder的回答

date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45 UTC"); // UTC Unix timestamp. 
echo date('Y-m-d H:i:s a T', $utc_ts); 

應該輸出

2011-04-26 10:45:00 pm EDT 

的區別是加入的S我們的時區。 strtotime()也接受時區你知道! :p