2010-03-03 137 views
1

我遇到了一個問題,PHP和MySQL似乎不同意在將某些時間戳轉換回日期和時間時應該使用哪個時區。PHP和MySQL之間的時區差異

問題出現時,我有一個時間戳,我想轉換回datetime格式。 PHP提供的日期和時間基於GMT作爲時區,但MySQL似乎認爲它在GMT + 1運行,並據此進行轉換。


簡單再生產

$original_date = '2009-08-31 23:59:59'; 
$timestamp = strtotime($original_date); 
echo $timestamp;         // Gives 1251763199 

echo date('Y-m-d H:i:s', $timestamp);    // PHP: 2009-08-31 23:59:59 
echo db_field('SELECT FROM_UNIXTIME(1251763199)'); // MySQL: 2009-09-01 00:59:59 

由PHP參數給出的時間似乎是correct one給定的日期,假定時區爲GMT。如果我們運行BST,那麼MySQL的結果將是正確的(當時給出的時間戳落在GMT + 1之內)。

如果我從今天開始使用$timestamp1267640942),PHP和MySQL似乎都很樂意告訴我它是2010-03-03 18:29:02(都返回GMT)。


什麼時區設置的服務器上?

我檢查了the MySQL docs,這表示如果我的時區設置爲system比操作系統將提供時區信息。目前情況似乎如此:

mysql> SELECT @@global.time_zone, @@session.time_zone; 
+--------------------+---------------------+ 
| @@global.time_zone | @@session.time_zone | 
+--------------------+---------------------+ 
| SYSTEM    | SYSTEM    | 
+--------------------+---------------------+ 

我的web服務器上的默認時區是GMT。這也是我的數據庫服務器上的默認系統時區(根據在每臺服務器上運行的date命令)。

[email protected]:/home/foo$ date 
Wed Mar 3 18:45:02 GMT 2010 


所以根據文檔,我的DB服務器應該在格林尼治標準時間,這是我們所希望的運行。然而,在我的測試腳本中給出的查詢輸出表明它在GMT + 1中運行。

我知道這個問題有很多解決方法(所有的日期算法都是在PHP或MySQL等中完全完成的),但我很想深究造成這種差異的原因,所以我們可以對其進行排序並防止團隊中的其他人被絆倒。

有誰知道是否有一個非常基本的設置,我已經在這裏看過,或知道什麼可能導致這種差異?

謝謝!

+0

您運行的是哪個版本的PHP? – blockhead 2010-03-03 18:58:31

+0

@blockhead PHP 5.2.0 – ConroyP 2010-03-03 19:01:39

+0

你有沒有在你的mysql連接上顯式地使用set time_zone = ...? – roman 2010-03-03 19:47:22

回答

2

我用這個方法:

照顧PHP和離開MySQL的單獨

建議設置通過date_default_timezone_set php函數爲php預設時區。

使用保持最新記錄時間戳字段類型在MySQL

那麼當您插入:

$sDate = date("Y-m-d H:i:s"); 
mysql_query("insert into `table` set `created_on` = '$sDate' "); 

,當你選擇:

mysql_query("select `created_on` from `table` "); 
$iTime = strtotime($aRow['created_on']); 

你總是可以有機會獲得全球時間使用gmdate php功能:

$iTime_Global = gmdate("U", $iTime); 

如果你只是照顧你的PHP代碼,那麼mysql的時區在你的應用程序中將不起作用。 (由時區設置)