2012-12-27 21 views
0

我正在研究一個新項目,它有很多不同的數據,並且它們都存儲在具有相同時區時間戳的東海岸數據庫中,我確保服務器時間任何通過更改時區並從中獲取MYSQL的結果

date_default_timezone_set("America/New_York"); 

加載不過,我似乎無法環繞它我的頭前區切換到它,我想有一個搜索功能,它允許一個時區選擇,如果他們選擇西海岸什麼時區,我應該只更改PHP部分?或者我應該查詢數據庫不同?所有的數據都非常時間敏感,並且很難將其包裹在我的頭上。

任何幫助或邏輯,將不勝感激:P

+0

什麼版本的所有日期時間的PHP使用? – Lars

+0

5.4我已經通過date_default_timezone_set爲西海岸設置了時區,它似乎在做詭計,然而有些事情在邏輯上搞砸了 –

回答

1

的主要問題是MySQL對時區的支持是可笑。大多數其他數據庫允許您將時區定義爲日期時間列的一部分,但不是MySQL。相反,它們會強制您執行連接範圍或服務器範圍的時區設置。

最好的辦法是確保MySQL將所有日期時間存儲爲GMT/UTC。您可以通過在連接上運行SET time_zone = 'UTC'來強制執行此操作。在設置字符集的同時執行此操作。你設置連接字符集,

PHP端,然後您可以使用DateTimeDateTimeZone的組合來獲取MySQL的日期時間並將它們顯示在用戶的時區中。例如,假設我們從MySQL DATETIME列中獲取日期2012-11-13 14:15:16。從PHP交互提示:

php > $from_mysql = '2012-11-13 14:15:16'; 
php > $utc = new DateTimeZone('UTC'); 
php > $ts = new DateTime($from_mysql, $utc); 
php > $pdt = new DateTimeZone('America/Los_Angeles'); 
php > $ts_pdt = clone $ts; 
php > $ts_pdt->setTimezone($pdt); 
php > echo $ts_pdt->format('r'), "\n"; 
Tue, 13 Nov 2012 06:15:16 -0800 

作爲證明,你只需要通過明確告訴它創建日期時間你是UTC,如果UTC是不是你已經使用date_default_timezone_set設置時區。切換DateTime的時區與給它一個新的一樣簡單。我在這裏使用clone來複制副本。 DateTimes是可變的,並且有時很容易發現自己意外地破壞它。

反向日期數學的工作方式相同,只是將其選擇轉換爲UTC並在本機數字上運行數學運算。

TL;博士:

  • 商店執行UTC上日期時間計算(GMT)僅
  • 顯示用戶的時區僅