kbr*_*bro 5 mysql sql datetime timestamp utc
我的应用程序想要将时间戳值插入到 mySQL 数据库中的 TIMESTAMP 变量中。时间戳值是 UTC 时间,采用通常的“YYYY-MM-DD HH:MM:SS”格式。问题是我的SQL服务器设置为使用系统时间(SELECT @@global.time_zone说SYSTEM),并且系统时区是欧洲/伦敦(服务器运行的是Ubuntu 14.04),因此mySQL进行夏令时转换并将值存储为比它应该是什么。(我想如果我在另一个时区,例如 CST,那么我会有一个不需要的时区偏移以及夏令时)。
为了让 mySQL 做正确的事情,我似乎需要在插入它之前将 UTC 时间戳转换为系统时间,以便 mySQL 可以在内部存储它之前将其从系统时间转换为 UTC 时间。这段代码达到了预期的效果:-
mysql> select timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)
mysql> select timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)
我现在打算这样做,但这似乎有点闲聊,那么有更好的方法吗?
[编辑]另一轮 RTFM 给了我这个想法......
mysql> select CONVERT_TZ("2015-05-06 12:34:56", "+00:00", "SYSTEM");
Run Code Online (Sandbox Code Playgroud)
+------------------------------------------------------------------+
| timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP |
+------------------------------------------------------------------+
| 20150506133456.000000 |
+------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
这看起来干净很多。还有更好的想法吗?
您可能可以使用CONVERT_TZ使用指定时区而不是系统时区来解析日期的函数:
SELECT CONVERT_TZ('2015-05-06 12:34:56','+00:00','SYSTEM') AS `Local Time`,
UNIX_TIMESTAMP(CONVERT_TZ('2015-05-06 12:34:56', '+00:00', 'SYSTEM')) AS `UNIX Timestamp`;
Run Code Online (Sandbox Code Playgroud)
SELECT CONVERT_TZ('2015-05-06 12:34:56','+00:00','SYSTEM') AS `Local Time`,
UNIX_TIMESTAMP(CONVERT_TZ('2015-05-06 12:34:56', '+00:00', 'SYSTEM')) AS `UNIX Timestamp`;
Run Code Online (Sandbox Code Playgroud)
本地时间值将根据运行查询的系统而有所不同。但是,UNIX 时间戳值将相同。
然后您可以在时间戳列中插入本地时间值;MySQL将存储转换后的值。