更新 mysql 时区并更改所有 TIMESTAMPS 列

Posted

技术标签:

【中文标题】更新 mysql 时区并更改所有 TIMESTAMPS 列【英文标题】:Update mysql timezone and change all TIMESTAMPS columns 【发布时间】:2015-12-04 10:29:03 【问题描述】:

首先我将 mysql 设置为 America/Montreal

SET time_zone = 'America/Montreal

为了确保一切正常,我在 php 中使用:

date_default_timezone_set('America/Montreal');

我不明白的是,保存在数据库中的值不正确,例如 11:00:00 将保存 10:00:00,但是在获取信息时我会显示 11:00:00。因此,最终系统按我们的意愿运行,但数据库中的数据不准确。有人可以解释我为什么吗? 例如,我将列 start_time 设置为 TIMESTAMP

"INSERT into table set start_time = '".date("Y-m-d H:i:s")."'

假设当前时间为 11:00:00,但保存的时间为 10:00:00,获取时将返回 11:00:00。

然后回到我的问题,由于数据不准确,我想将服务器时间更改为正确的时间并让 MySQL 使用新时间,如果这样做,数据库中的日期/时间数据会自动更新?如果不是,我该如何更新新时区的所有日期和时间?

谢谢。

【问题讨论】:

您所指的列的数据类型是什么?您问题的标题是“日期列”,但显然 MySQL 的 DATE 数据类型不存储时间;并且DATETIMETIME 数据类型不支持时区...只有TIMESTAMP 数据类型对时区敏感——这些值在内部存储为UTC,但在插入时从/到数据库连接的time_zone 转换/恢复。听起来好像您需要相应地设置该变量。 “将节省 10:00:00”是什么意思?您对这一点的确定程度如何准确 【参考方案1】:

那是因为您的 MySQL 服务器有另一个时区(您的 PHP 服务器与您的 MySQL 服务器不同)!当您获取时间戳字段时,php 会根据您的默认时区自动对其进行本地化。要在您的数据库上也有正确的时间戳,您需要在连接到 MySQL 时设置它:

$mysqli->query("set time_zone = '+00:00'");

此命令将您的 MySQL 连接时区设置为 GMT,但对于蒙特利尔,它应该是 -05:00

希望这会有所帮助!

【讨论】:

以上是关于更新 mysql 时区并更改所有 TIMESTAMPS 列的主要内容,如果未能解决你的问题,请参考以下文章

从 phpMyAdmin 更改 mysql 时区

PostgreSQL:无法使用 DST 使时区正常工作

将 MySQL 数据库时区设置为 GMT

mysql更改时区

MySQL时区更改?

更改 MySQL 中的连接时区