我想独立于服务器上配置的时区,所以在脚本中我这样设置时区:
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();
我使用的是时间戳字段类型而不是日期时间。
我得到的不是显示的时间戳,它是 future 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 种可能的情况:
存储转换有效,select 无效:否 - 因为那样时间戳将是过去 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 或其他事情。
但它不应该至少与 select 一起工作吗?
我错过了什么吗?如果我想在 mysql 数据库中以 UTC 格式正确存储和读取时间戳,但在具有不同时区的脚本中读取/写入它们,我该怎么办?
最佳答案
答案很简单。
上面的方法很好,MySql 只是不知道任何时区。
您可以使用命令 SET time_zone = 'UTC';
如果您遇到与提问者相同的问题,您应该会收到以下错误:
#1298 - Unknown or incorrect time zone: 'UTC'
这可以通过以下命令轻松解决:
mysql_tzinfo_to_sql /usr/share/zoneinfo/|mysql -u root mysql -p
关于php - 需要在每个连接的基础上在 PHP/MySQL 中使用 UTC 时间戳转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6379577/