2013-03-12 141 views
0

我正在創建一個基於調度約會的應用程序,在用戶可以選擇他們想要的時區的環境中。如何正確存儲和使用不同時區的MySQL TIMESTAMP?

經過一番研究,我確信使用MYSQL的TIMESTAMP來存儲所有的日期。我想認爲,當使用TIMESTAMP時,所有日期都將被轉換並存儲爲UTC。然後,從數據庫中提取日期時,TIMESTAMP列將轉換爲MYSQL的時區。

下面是我的當前設置的一些示例代碼:

在每一頁上的時區是爲PHP和MYSQL 設置(用戶選擇基於這個例子PST)。

date_default_timezone_set('US/Pacific'); 
SET time_zone = '-08:00' 

當把時間放入MYSQL中時,我只是將時間戳轉換爲正確的格式。

date("Y-m-d H:i:s", $unix_timestamp); 

當從數據庫中拉出表單時,我會簡單地使用MYSQL轉換爲UNIX。

SELECT UNIX_TIMESTAMP(created_at) as created_at FROM `table` WHERE id=1 

這是優雅的,似乎完美的工作。 MySQL只是使用TIMESTAMP來爲我完成所有重要的時區轉換工作。也就是說,直到夏令時發生。現在,任何時候選擇非UTC時區時,時間爲小時off

我在做什麼,錯了?請幫忙!

回答

2

如果您使用;

date_default_timezone_set('US/Pacific'); 
SET time_zone = '-08:00' 

... MySQL的服務器時區將是一個小時,從太平洋時間在夏天,因爲PDTGMT-07:00。反而使用例如;

date_default_timezone_set('US/Pacific'); 
SET time_zone = 'America/Los_Angeles'; 

... MySQL的服務器時間將支持DST的變化,你應該得到正確的時區轉換。

由於MySQL並不總是包含所有可用的時區,所以如果系統中缺少America/Los_Angeles時區,則this page should help you install it

由於您使用的是每個用戶的動態時區,因此您可能需要某種查找表來在MySQL和PHP時區之間進行轉換,因此您可以根據每個用戶設置它們。

+0

我一定是以社區不喜歡的方式表達了我的問題,但我確定他們是否像我們一樣真正理解了我的問題,它就不會被封閉。謝謝。 – 2013-03-15 03:46:43

0

爲什麼不在數據庫中存儲UTC的時間(格林威治標準時間與我們英語喜歡的一樣)?

然後使用mySql中的CONVERT_TZ()函數或PHP中的setTimezone

這將使人們能夠輕鬆地查看其他人的日曆並將其轉換爲當地時間。因此沒有人有理由過早或過晚(或在錯誤的日子!)。

+0

那麼,我假設MYSQL的TIMESTAMP列自動存儲所有時間爲UTC。這似乎做得很好,但現在出於某種原因,在2天前發生的夏令時之後,我的時間已經過去了一個小時。 – 2013-03-12 06:33:40

相關問題