将 MySQL 数据库时区设置为 GMT

Posted

技术标签:

【中文标题】将 MySQL 数据库时区设置为 GMT【英文标题】:Set MySQL database timezone to GMT 【发布时间】:2012-12-04 16:50:18 【问题描述】:

我需要更改单个数据库的时区可以吗?

我知道我们可以在 WHM 中更改时区(我们使用 hostgator 的专用服务器),但是在服务器上运行的大量旧版软件中有很多 +6 小时的编码(即服务器时区是CST,我们想要 GMT 时间,因此以前的开发人员在代码中手动更改了日期/时间 - 糟糕!)。

我现在正在开发一个新软件,并希望在 GMT 中使用它,我知道我可以使用 date_default_timezone_set('GMT') 但这不会解决 mysql 插入的问题,其中 datetime 列设置为 CURRENT_TIMESTAMP,因为它会插入@CST 时区。

【问题讨论】:

【参考方案1】:

不,不能更改 MySQL 实例中单个数据库的时区。

我们可以通过查询检索服务器和客户端time_zone 设置,如下所示:

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

我们还可以更改会话的客户端时区,或更改整个 MySQL 实例的时区。

但我们需要敏锐地意识到这种变化将对现有客户端连接产生的影响,以及如何解释已经存储在实例中的 DATETIMETIMESTAMP 值。

要在 MySQL 实例启动时设置服务器 time_zone,我们可以在 [mysqld] 部分下修改 /etc/my.cnf 文件(或读取 mysql 实例初始化参数的任何位置):

[mysqld]
default-time-zone='+00:00' 

-- 或--

也可以(不太理想)将--default_time_zone='+00:00' 选项添加到mysqld_safe

注意: 更改 MySQL 服务器上的时区设置不会更改存储在现有 DATETIME 或 TIMESTAMP 列中的值,但因为它确实有效地更改了解释这些存储值的上下文,所以它看起来所有的值都被转移了。 (其中 08:00 表示美国中部标准时间上午 8 点,服务器的 time_zone 从 CST 更改为 GMT,同样的“08:00”现在将被视为格林尼治标准时间上午 8 点,实际上是美国中部标准时间凌晨 2 点。

另外请记住,TIMESTAMP 列始终以 UTC 格式存储,而 DATETIME 列没有时区。 http://dev.mysql.com/doc/refman/5.5/en/datetime.html

每个客户端会话都可以更改自己会话的时区设置:

SET time_zone='-06:00';

但这并没有真正“解决”时区转换问题,它只是移动了转换问题。

应用层处理时区转换本身并没有什么“坏处”;有时,这是最好的处理方式。它只需要正确且始终如一地完成。

(您描述的设置的奇怪之处在于,该应用程序存储 DATETIME 值,就好像 MySQL 服务器 time_zone 设置为 GMT,但 MySQL 服务器 time_zone 设置为其他值一样。)

【讨论】:

非常感谢您提供清晰简洁的答案 - 遗憾的是这是不可能的 - 我认为是另一台服务器! 设置时区='-06:00';应该是 SET time_zone='-06:00';【参考方案2】:

如果您无法更改当前时区,您可以更改结果。

日期 2015-01-05 12:06:16

Select date + Interval 2 Hour 'date' From ExampleTable

日期 2015-01-05 14:06:16

【讨论】:

【参考方案3】:

您可以修改默认值而不是输入 current_timestamp 使其插入 current_timestamp 添加到您的时区的小时偏移量。在没有找到任何解决方案的情况下,我只是这样做了,不得不自己发明。

【讨论】:

以上是关于将 MySQL 数据库时区设置为 GMT的主要内容,如果未能解决你的问题,请参考以下文章

mysql修改和查看时区(十五)

强制 Java 时区为 GMT/UTC

选择 Now() 作为 CurrentDateTime mysql 时区

如何将日期/时间从 GMT 转换为本地时区

用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

mysql2468报错