我试图在将行插入数据库之前将 CURRENT_TIMESTAMP 设置为 UTC。根据我的阅读,这就是针对每个连接执行此操作的方法。
我的服务器时区是 EST (+5:00)。
我在调试时执行以下操作:
- 选择 CURRENT_TIMESTAMP;存储这个家伙以便在调试时使用。
- SET TIME_ZONE = '-00:00';
- 选择 CURRENT_TIMESTAMP;存储这个家伙以便在调试时使用。
- 到目前为止,我希望数据库连接的 time_zone 为 UTC。
- 照常插入/更新记录。
然后,我将两个时间戳传回我的页面,只是为了看看它们是什么。
第一个默认为 EST:[CURRENT_TIMESTAMP] => 2016-12-15 14:01:52
第二个是查询设置的 UTC:[CURRENT_TIMESTAMP] => 2016-12-15 19:01:52
但是,数据库中的记录的 CURRENT_TIMESTAMP 为 2016-12-15 14:01:52 (EST)。
不知道为什么!
<小时/>我正在使用 Sequel Pro 查看我的数据库。 似乎 Sequel Pro 将时间戳转换为本地时间。
记录按需要/预期通过 SQL 返回:
2016-12-15 19:46:50
续集专业版显示:
2016-12-15 14:46:50
所以......这让我对我选择的数据库应用程序处理时区的方式感到有点不安。如果有人认为这不是实际问题,请务必告诉我:)
最佳答案
TIMESTAMP
数据类型始终以UTC 时间存储在MySQL 中。除了偏移之外,无法引用其他时区来存储它。每当渲染时,都会使用当前的 time_zone
对其进行翻译。环境。无法查看存储的 TIMESTAMP
的实际值除非设置 time_zone
设置为UTC
或-00:00
或同等内容,然后阅读它。
所以,
SET time_zone = 'America/Halifax';
SELECT @a := CURRENT_TIMESTAMP; --> 2016-12-15 15:49:49
SET time_zone = 'UTC';
SELECT @a, CURRENT_TIMESTAMP; --> 2016-12-15 15:49:49 2016-12-15 19:49:49
SET time_zone = 'America/Halifax';
SELECT @a, CURRENT_TIMESTAMP; --> 2016-12-15 15:49:49 2016-12-15 15:49:49
在该序列的第二行中,当前时间戳在大西洋标准时间的上下文中呈现为文本字符串变量 @a。
在第四个中显示文本字符串,然后在 UTC 上下文中呈现当前时间戳。
DATETIME
和DATE
数据逐字存储,不引用时区设置。
关于MySQL 每个连接时区未正确填充 CURRENT_TIMESTAMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41171713/