需要在每个连接的基础上在PHP / MySQL中使用UTC时间戳转换

时间:2011-06-16 23:01:20

标签: php mysql timestamp

我希望独立于服务器上配置的时区,因此在脚本中我设置时区如下:

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

服务器当前配置为Europe / Moscow,目前为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();

我使用的是Timestamp字段类型,而不是Datetime。

不是我显示的是将来2个小时的时间戳。

mysql doc说:

  

TIMESTAMP列的值是   从当前时区转换而来   到UTC用于存储,从UTC到   当前检索的时区。

所以这让我想到了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时间转换的问题,因为它是一个字符串,我应该做FRO​​M_UNIXTIME或其他东西。

但是至少应该选择那么吗?

我错过了什么吗?如果我想在mysql数据库中以UTC格式正确存储和读取时间戳,但是在具有不同时区的脚本中读/写它们,我该怎么做呢?

1 个答案:

答案 0 :(得分: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