我希望独立于服务器上配置的时区,因此在脚本中我设置时区如下:
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时间转换的问题,因为它是一个字符串,我应该做FROM_UNIXTIME或其他东西。
但是至少应该选择那么吗?
我错过了什么吗?如果我想在mysql数据库中以UTC格式正确存储和读取时间戳,但是在具有不同时区的脚本中读/写它们,我该怎么做呢?
答案 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