什么是我的服务器本地时区设置

每个服务器都有一个默认的全局 time_zone 设置,由服务器计算机的所有者配置。你可以通过以下方式设置当前时区:

SELECT @@time_zone

不幸的是,这通常会产生值 SYSTEM,这意味着 MySQL 时间由服务器操作系统的时区设置决定。

这一系列的查询(是的,它是一个黑客攻击 )可以为你提供服务器时区设置和 UTC 之间的分钟偏移量。

CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;

这是如何运作的?临时表中具有不同数据类型的两列是线索。DATETIME 数据类型始终以本地时间存储在表中,TIMESTAMPs 以 UTC 格式存储。因此,当 time_zone 设置为 UTC 时执行的 INSERT 语句存储两个相同的日期/时间值。

然后,当 time_zone 设置为服务器本地时间时,将完成 SELECT 语句。TIMESTAMPs 总是从它们存储的 UTC 表单转换为 SELECT 语句中的本地时间。DATETIMEs 不是。因此, TIMESTAMPDIFF(MINUTE...) 操作计算本地时间和世界时间之间的差异。