上下文:MySQL 版本
在 MySQL 5.7.17 上(如 所示SHOW VARIABLES LIKE "%version%";
)
上下文:MySQL 时区设置
并SELECT @@global.time_zone, @@session.time_zone;
屈服
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
...这意味着服务器跟踪系统时区。
上下文:系统时区
这是一个 Linux,我们像这样检查系统时区(输出编辑):
$ timedatectl
Local time: Wed 2018-02-14 13:21:30 GMT
Universal time: Wed 2018-02-14 13:21:30 UTC
RTC time: Wed 2018-02-14 13:21:30
Time zone: Europe/London (GMT, +0000)
背景:我们所知道的
- 时间和日期值不与 MySQL 中的时区信息一起存储(在DATE、DATETIME 和 TIMESTAMP 类型中对此没有明确的描述,除了“MySQL 将 TIMESTAMP 值从当前时区转换为 UTC 进行存储,然后从 UTC 转换回来到当前时区进行检索。(这不会发生在其他类型,例如 DATETIME。)”;请注意,“将 TIMESTAMP 值转换为 UTC 以进行存储”实际上仅作为实现者的说明才有意义,它对用户没有用 -重要的是 TimeZONE 总是在任何时区返回正确的值,而 DATETIME 总是在任何时区返回相同的值)
上下文:当前时间
现在是:
$ date +"The current time is %s alias %c"
The current time is 1518617572 alias Wed 14 Feb 2018 14:12:52 GMT
问题
让我们运行:
SELECT NOW(),FROM_UNIXTIME(0),UNIX_TIMESTAMP(),FROM_UNIXTIME(UNIX_TIMESTAMP());
输出(适合手动旋转;应该有一个选项):
NOW() 2018-02-14 14:15:13 -- Display "now" in SYSTEM timetone: OK
FROM_UNIXTIME(0) 1970-01-01 01:00:00 -- Display 1970-01-01 00:00:00 in SYSTEM timetone: NOT OK
UNIX_TIMESTAMP() 1518617713 -- Correct unixtime
FROM_UNIXTIME(UNIX_TIMESTAMP()) 2018-02-14 14:15:13 -- Same as NOW(): OK
在上面的一切都很好,除了FROM_UNIXTIME(0)
给予1970-01-01 01:00:00
,这是一小时的休息。如果 Unix 时间 0 以 UTC 显示,它会给出1970-01-01 00:00:00
(或者会?)
如果我在本地或从远程计算机连接,就会发生这种情况。
为了更加确定,我通过强制到 DATETIME 进行了检查。也会发生同样的情况:
CREATE TEMPORARY TABLE test (N DATETIME, FUX DATETIME, UXT LONG, NN DATETIME);
INSERT INTO test SELECT NOW(),FROM_UNIXTIME(0),UNIX_TIMESTAMP(),FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT * FROM test;
+---------------------+---------------------+------------+---------------------+
| N | FUX | UXT | NN |
+---------------------+---------------------+------------+---------------------+
| 2018-02-14 14:19:51 | 1970-01-01 01:00:00 | 1518617991 | 2018-02-14 14:19:51 |
+---------------------+---------------------+------------+---------------------+
在时间 0,“时区:欧洲/伦敦”是 DST(或不是 DST?);你目前不在夏令时(或者你是?)。这可能是1小时的差异。
欧洲/伦敦与 UTC 不同。
这确实取决于会话时区。我和你在同一个时区:
以下结果来自 MariaDB,但我认为它与 MySQL 相同。
和:
然而:
鉴于我的时区是 GMT,+0000,我很惊讶 time_zone 的值
SYSTEM
并+0:00
给出了不同的结果。FROM_UNIXTIME(0)
这对我来说似乎是一个错误,但也许有一些我不理解的东西。