2016-12-15 103 views
0

我想正确的插入行到数据库之前设置CURRENT_TIMESTAMP为UTC。从我读过的内容来看,这就是你如何通过连接来完成它。MySQL的每个连接的时区不填充CURRENT_TIMESTAMP正确

我的服务器的时区是EST(+5:00)。

我做了以下在调试时:

  1. SELECT CURRENT_TIMESTAMP;存储这个人在调试时使用。
  2. SET TIME_ZONE ='-00:00';
  3. SELECT CURRENT_TIMESTAMP;存储这个人在调试时使用。
  4. 截至目前,我希望我的数据库连接的time_zone是UTC。
  5. 插入/更新记录照常。

然后,我将两个时间戳传递回我的页面,看看它们是什么。

第一个被默认为EST:[CURRENT_TIMESTAMP] => 2016-12-15 14:01:52

二是UTC通过查询设置:[CURRENT_TIMESTAMP] => 2016-12-15 19:01:52

然而,在数据库中记录有2016年12月15日14:01的CURRENT_TIMESTAMP: 52(美国东部时间)。

不知道为什么!


我正在使用Sequel Pro查看我的数据库。 似乎Sequel Pro会将时间戳转换为当地时间。

通过SQL该记录返回所期望/预期:

2016-12-15 19:46:50

续集专业显示:

2016-12-15 14:46:50

所以......这让我心烦一点点我的选择数据库应用程序如何处理时区。如果有人认为这不是真正的问题,所有的手段让我知道:)

回答

1

TIMESTAMP数据类型是总是存储在MySQL中的UTC。除了通过抵消它之外,没有办法参考其他时区来存储它。翻译完成后,使用当前的time_zone设置进行翻译。除了通过设置time_zone设置为UTC-00:00或某些等价物,然后阅读它,没有办法查看存储的TIMESTAMP实际值。

所以,

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 and DATE数据是逐字存储的,没有参考时区设置。

+0

这是总的意义。但是,我发现这个问题似乎与我用来查看我的数据库数据的应用程序(Sequel Pro)有关。该记录按预期从SELECT语句返回,但在应用程序中显示不同。 – Gurnzbot