2011-06-16 75 views
3

我想這樣一個腳本我設置時區像這樣獨立於服務器上配置的時區使用UTC時間戳轉換上一個:需要PHP/MySQL的每個連接

mysql_query("SET time_zone = '".date_default_timezone_get()."';"); 

服務器當前配置爲歐洲/莫斯科目前是UTC + 4

然後在PHP的網站我從數據庫中選擇是這樣的:

date_default_timezone_set('Europe/Berlin'); 
$sth = $dbh->prepare("SET time_zone = '".date_default_timezone_get()."';"); 
$sth->execute(); 
$sth = $dbh->prepare("SELECT * from logs WHERE time like '2011-06-1%'"); 
$sth->execute(); 

我使用時間戳字段TY PE而不是Datetime。

不是我顯示的是一個時間戳,在未來2小時太遠。

MySQL的醫生說:

Values for TIMESTAMP columns are converted from the current time zone to UTC for storage, and from UTC to the current time zone for retrieval.

因此,這使我想到了3種可能的情況:

  • 存儲改建工程,選擇不:不 - 因爲那時的時間戳是2 (或1在冬天)過去幾小時過去

  • 存儲轉換不起作用,但選擇做:否 - 因爲那麼我會看到UTC是-1小時這是不是案例

  • 存儲轉換不起作用,選擇轉換不起作用:看起來就像它!

現在我寫到數據庫中的時間戳進行構造並寫PHP方面:

$hourprec = "Y-m-d H:00:00"; 
$hour = date($hourprec); // mysql compatible 
... 
REPLACE INTO logs (time,...) VALUES('".$hour."','".... 

我可以想像,這使得問題mysqls時間轉換,因爲它是作爲一個字符串,我應該怎麼辦FROM_UNIXTIME什麼的。

但是,它不應該至少與選擇工作嗎?

我錯過了什麼嗎?如果我想在MySQL數據庫中以UTC正確存儲和讀取時間戳,但是如何在具有不同時區的腳本中讀取/寫入它們,我該怎麼做呢?

+0

請不要問爲什麼我使用mysql和pdo的混合,並準備沒有params xD的語句 – 2011-06-16 23:27:48

回答

4

答案相當微不足道。

上面的方法很好,MySql只是不知道任何時區。

您可以用命令來測試這個SET time_zone = 'UTC';

如果你有同樣的問題,你應該收到以下錯誤提問:

#1298 - Unknown or incorrect time zone: 'UTC' 

這可以很容易固定用下面的命令:

mysql_tzinfo_to_sql /usr/share/zoneinfo/|mysql -u root mysql -p