将UTC时间值安全地插入mySQL TIMESTAMP变量的更好方法是什么?

时间:2015-05-05 11:53:17

标签: mysql sql datetime timestamp utc

我的应用程序想要将时间戳值插入mySQL数据库中的TIMESTAMP变量。时间戳值是通常" YYYY-MM-DD HH中的UTC时间:MM:SS"格式。问题是我的SQL服务器设置为使用SYSTEM时间(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;
+------------------------------------------------------------------+
| timestamp("2015-05-06 12:34:56")+CURRENT_TIMESTAMP-UTC_TIMESTAMP |
+------------------------------------------------------------------+
|                                            20150506133456.000000 |
+------------------------------------------------------------------+

我现在要用这个来运行,但它看起来像是一个偏执狂,所以还有更好的方法吗?

[编辑]另一轮RTFM给了我这个想法...

mysql> select CONVERT_TZ("2015-05-06 12:34:56", "+00:00", "SYSTEM");
+-------------------------------------------------------+
| CONVERT_TZ("2015-05-06 12:34:56", "+00:00", "SYSTEM") |
+-------------------------------------------------------+
| 2015-05-06 13:34:56                                   |
+-------------------------------------------------------+

看起来更清洁了。有更好的想法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用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`;
+---------------------+----------------+
| Local Time          | UNIX Timestamp |
+---------------------+----------------+
| 2015-05-06 17:34:56 |     1430915696 |
+---------------------+----------------+

本地时间值将根据运行查询的系统而有所不同。但是,UNIX时间戳值将相同。

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