我遇到了一個問題,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之內)。
如果我從今天開始使用$timestamp
(1267640942
),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等中完全完成的),但我很想深究造成這種差異的原因,所以我們可以對其進行排序並防止團隊中的其他人被絆倒。
有誰知道是否有一個非常基本的設置,我已經在這裏看過,或知道什麼可能導致這種差異?
謝謝!
您運行的是哪個版本的PHP? – blockhead 2010-03-03 18:58:31
@blockhead PHP 5.2.0 – ConroyP 2010-03-03 19:01:39
你有沒有在你的mysql連接上顯式地使用set time_zone = ...? – roman 2010-03-03 19:47:22