php - 如何正确设置mysql时区

标签 php mysql timezone

我有一个关于 mysql 时区的奇怪问题。

在我的网站配置文件中,我有这一行来设置时区:

mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that

有趣的是,如果我像这样在这之后添加另一行:

$q = mysql_query("SELECT NOW() as now");
$row = mysql_fetch_array($row);
echo $row["now"];

执行该代码后,时间显示正确。

但是,在其他一些查询中,我在表中插入行,这些行有一个名为 date 的列,默认为 CURRENT_TIMESTAMP。

行是这样插入的:

INSERT INTO `sessions` (`user_id`) VALUES `1`

( session 表有一个默认为 CURRENT_TIMESTAMP 的 date 列)

但数据库中插入的值仍然指向服务器的时区:((

有什么想法可以解决这个问题吗?

最佳答案

你要明白,MySQL维护了多个时区设置:

  • 系统时区(基本上就是OS设置的时区)
  • 服务器时区(MySQL使用的时区)
  • 客户端时区(每个连接使用的 session 时区)

参见 http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html了解详情。

日期/时间值以两种不同的方式存储:

  • 所有基于 unix 时间戳的值始终以 UTC 格式存储。当它们被存储和读取时,它们会在内部动态地从客户端时区转换到客户端时区。 NOW() 和 CURTIME() 函数也是如此,因为它们是基于时间戳的。
  • DATE、TIME 和 DATETIME 列(以年-月-日时-分-秒的格式存储它们的值)不受时区设置的影响,也从不转换。

从上面可以清楚地看出,当您从基于 unix 时间戳的列中读取时看到的值不一定是真正存储在数据库中的值。它们使用服务器时区和客户端时区进行转换。如果您不了解机制的细节,结果可能会令人困惑。

对于第一个测试,尝试通过执行找出每个客户端程序中的当前设置

SELECT @@global.time_zone, @@session.time_zone;

全局时区将始终相同。但是 session 时区可能因客户端应用程序而异,并且会改变您的读写操作的结果。

关于php - 如何正确设置mysql时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434030/

相关文章:

php - 是否可以在 php 站点上进行 Windows 身份验证?

php - #1241 - 操作数应包含 1 列 : why?

MySQL - UNION ALL 查询 - 未知列错误

php - 从iOS设备获取时区,并在php中请求Web API

javascript日期问题

c# - 如何在 javascript 中从 Entity Framework 获取正确的日期

PHP MYSQL - 比较 2 个逗号分隔的列表

php - 尝试测试 UPS "Quantum"接口(interface) - XML 文档格式不正确

sql - 我需要帮助编写一个复杂的(对我而言)SELECT 语句

javascript - 通过http实时远程监控/控制服务器的正确方法