2010-11-22 81 views
1

我的服務器在美國,而我在英國。時區問題mysql

我使用默認的CURRENT_TIMESTAMP將時間戳值存儲在mysql服務器上。所以當條目被添加到我的表格中時,它們會被打上當前時間。這是服務器時間(美國),然後通過mysql轉換爲UTC。

當我檢索我希望它們顯示在當前時區(英國)的值。所以在我的PHP我用下面的函數設置當前時區:

mysql_query("SET time_zone = timezone;"); 

這似乎當我問MySQL的回聲服務器和會話時區,我得到SYSTEM和-08:00分別。然而,當我稍後在相同的PHP腳本中打印我的時間戳值時,它們將在美國時間輸出。

獲得的結果在PHP中:

$result = mysql_query("SELECT ID,DateTime,Name,Comment,Location,Rating FROM table1 WHERE Latitude<$latup AND Latitude>$latdown AND Longitude<$lngup AND Longitude>$lngdown ORDER BY DateTime DESC") 

while(($row = mysql_fetch_array($ratingresult)) && ($i++ < 1)) { 
    echo "<tr><td>"; 
    echo $row['DateTime']; 
    echo "</td><td>"; 
    echo $row['Name']; 
    echo "</td><td>"; 
    echo $row['Comment']; 
    echo "</td><td>"; 
    echo $row['Location']; 
    echo "</td><td>"; 
    echo $row['Rating']; 
    echo "</td><td>"; 
    rate($row, $lat, $lng); 
    echo "</td></tr>"; 
} 

任何幫助將非常感激!

+1

請出示一些代碼,尤其是當你打印時間戳值在PHP – 2010-11-22 16:16:21

+0

而`SET time_zone`查詢爲相同的請求期間進行提取時間戳的查詢? – 2010-11-22 16:25:31

回答

0

在MySQL中處理多個時區可能會很棘手。

您必須非常小心地按照每個會話更改時區。除了更改從TIMESTAMP字段中檢索的顯示結果(實際上是自01-01-1970 00:00:00 GMT以來的秒數),它還將更改插入到DATETIME字段中的數據(實際上是硬編碼的字符串)和/或如何評估NOW()

如果它不是爲時已晚,你的應用程序將允許的話,我建議你設置服務器/全球時區英國(並在my.cnf相應變化太):

例如mysql> SET GLOBAL time_zone = timezone;http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

,或者,只是轉換到/全線使用DATETIME秒 - 確保當你做哪個時區的會議是在轉換

0

我已經使用PHP解決了這個問題。 。

$dt_obj = new DateTime($row['DateTime'], new DateTimeZone('America/Chicago')); 
$dt_obj->setTimezone(new DateTimeZone('Europe/London')); 
echo $dt_obj->format('d-m-Y H:i:s'); 

這是可行的,因爲我在美國的服務器在CST =芝加哥時區。我也刪除了我所有的修改mysql時區的嘗試。我確定更改服務器時區是一些人的解決方案,但我在共享服務器上,因此沒有權限。

我現在的問題是 - 有沒有辦法讓我的網站在全球範圍內工作?即通過檢測用戶運行時?我認爲這將需要JavaScript。

0

請仔細閱讀該代碼執行的正確的結果:

date_default_timezone_set('Europe/London'); 
mysql_query("SET time_zone = '".date('P')."';");