安全地将UTC时间值插入mySQL时间戳变量的更好方法?

安全地将UTC时间值插入mySQL时间戳变量的更好方法?,mysql,sql,datetime,timestamp,utc,Mysql,Sql,Datetime,Timestamp,Utc,我的应用程序希望将时间戳值插入mySQL数据库中的时间戳变量中。时间戳值是UTC时间,采用通常的“YYYY-MM-DD HH:MM:SS”格式。问题是,我的SQL server设置为使用系统时间(SELECT@@global.time\u zone表示SYSTEM),并且系统时区是欧洲/伦敦(服务器运行的是Ubuntu 14.04),所以mySQL会进行夏令时转换,并存储一小时后的值。(我想如果我在另一个时区,例如CST,那么我会有一个不需要的时区偏移以及夏令时) 为了让mySQL做正确的事情,

我的应用程序希望将时间戳值插入mySQL数据库中的时间戳变量中。时间戳值是UTC时间,采用通常的“YYYY-MM-DD HH:MM:SS”格式。问题是,我的SQL server设置为使用系统时间(
SELECT@@global.time\u zone
表示
SYSTEM
),并且系统时区是欧洲/伦敦(服务器运行的是Ubuntu 14.04),所以mySQL会进行夏令时转换,并存储一小时后的值。(我想如果我在另一个时区,例如CST,那么我会有一个不需要的时区偏移以及夏令时)

为了让mySQL做正确的事情,我似乎需要在插入UTC时间戳之前将其转换为系统时间,以便mySQL能够在内部存储之前将其从系统时间转换为UTC时间。此代码位具有所需的效果:-

mysql> select timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP;
+------------------------------------------------------------------+
|时间戳(“2015-05-06 12:34:56”)+当前时间戳-UTC时间戳|
+------------------------------------------------------------------+
|                                            20150506133456.000000 |
+------------------------------------------------------------------+
我现在打算用这个,但这似乎有点像是在说空话,所以有更好的办法吗

[编辑]又一轮的RTFM给了我这个想法

mysql> select CONVERT_TZ("2015-05-06 12:34:56", "+00:00", "SYSTEM");
+-------------------------------------------------------+
|转换(“2015-05-06 12:34:56”,“00:00”,“系统”)|
+-------------------------------------------------------+
| 2015-05-06 13:34:56                                   |
+-------------------------------------------------------+
看起来干净多了。有更好的主意吗?

您可能可以使用使用指定时区而不是系统时区解析日期的函数:

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`;
+---------------------+----------------+
|本地时间| UNIX时间戳|
+---------------------+----------------+
| 2015-05-06 17:34:56 |     1430915696 |
+---------------------+----------------+
本地时间值将因运行查询的系统而异。但是,UNIX时间戳值将是相同的


然后可以在时间戳列中插入本地时间值;MySQL将在转换后存储该值。

您可以将MySQL服务器时区设置为gmt,或者全局设置,或者仅为您的会话设置。如果可以,我可以,但我不能:-)是的,最好使用CONVERT_TZ,因为它还知道目标时间何时在夏令时之外,即使系统时间仍然在夏令时内。例如
选择CONVERT_TZ('2015-12-31 23:59:59',“+00:00”,“SYSTEM”)
做了正确的事情,而盲目地增加一小时则不行。