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

标签 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();

我使用的是时间戳字段类型而不是日期时间。

我得到的不是显示的时间戳,它是 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/

相关文章:

python - 在 Nose 中伪造 time.time() 的时间戳

php - 实现 Web 2.0 导航系统的最佳方式

php - 如何配置 php 以在不重新编译的情况下与 mysql 一起工作

mysql - 如何删除mysql查询中的重复项

php - 从 uuid1 中提取时间戳

mysql - 如果同一行中的字符串已更新,如何更新 mysql 时间戳?

扩展 ASCII 表上的 PHP ord() 函数

PHP:从 xml 生成数组时存在非法偏移类型

php - 搜索相似对象的数组

Mysql 查询返回的记录数多于返回的行数,我想要所有行