2011-06-16 72 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