2011-04-30 103 views
1

我有以下日期字符串轉換日期字符串UTC時間與PHP

$date="Sat Apr 30 2011 18:47:47 GMT+0900 (Tokyo)" 

我想將它轉換爲UTC時間

$timestamp_UNIX = strtotime($date); 
echo date("Y-m-d\TH:i:s\Z",$timestamp_UNIX); 

爲什麼我

2011-04-30T11:47:47Z 
and not 
2011-04-30T09:47:47Z 
+0

什麼是你'date.timezone'預設?該值可以在'php.ini'或'date_default_timezone_set()'中設置。 – 2011-04-30 10:27:28

回答

1

您應該使用gmdate()而不是date()(或者您可以在PHP 5.2/5.3中檢查DateTime和DateTimeZone類)

+0

對不起,我沒有在我的代碼中使用date()。我的日期是一個總是用這種格式寫的字符串。 – ths1104 2011-04-30 10:56:21

+0

你在你的問題中使用date()。它提供了輸出:'echo date(「Y-m-d \ TH:i:s \ Z」,$ timestamp_UNIX);'如果你改成gmdate()你會沒事的。 – Arjan 2011-04-30 11:01:08

+0

是的,我可以使用gmdate更正unix時間戳的偏移量。但它不會改變Unix時間戳有兩個小時偏移的事實。 – ths1104 2011-04-30 11:07:25

2

問題是您的代碼不會自動回顯UTC。無論您的默認時區設置爲何,它都會回顯時間戳。這可以通過在運行時通過date_default_timezone_set()或通過php.ini中的配置設置date.timezone完成。

現代方式將使用DateTimeDateTimeZone類。

$d = new DateTime('Sat Apr 30 2011 18:47:47 GMT+0900 (Tokyo)'); 
print_r($d); 
$d->setTimezone(new DateTimeZone('UTC')); 
print_r($d); 

打印

DateTime Object 
(
    [date] => 2011-04-30 18:47:47 
    [timezone_type] => 1 
    [timezone] => +09:00 
) 
DateTime Object 
(
    [date] => 2011-04-30 09:47:47 
    [timezone_type] => 3 
    [timezone] => UTC 
) 
+0

您認爲php.ini文件中的默認時區是+7而不是+9嗎?無論如何,我對這個文件沒有訪問權限,這意味着每個服務器都會輸出不同的日期...我會看看date_default_timezone_set()。我與你保持聯繫 – ths1104 2011-04-30 10:55:28

+0

默認時區最有可能與UTC的偏差爲+2小時(例如,由於夏令時,「歐洲/柏林」與UTC的距離爲2小時)。 'date_default_timezone_get()'將幫助你確定你的默認時區。 – 2011-04-30 10:59:26

相關問題