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

Better way to safely insert UTC time value into mySQL TIMESTAMP variable?

我的应用程序想要将时间戳值插入到 mySQL 数据库中的 TIMESTAMP 变量中。时间戳值是通常 "YYYY-MM-DD HH:MM:SS" 格式的 UTC 时间。问题是我的 SQL 服务器设置为使用系统时间(SELECT @@global.time_zoneSYSTEM),系统时区是 Europe/London(服务器是 运行 ning 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 |
+------------------------------------------------------------------+

我暂时要 运行 解决这个问题,但这似乎有点废话,有没有更好的方法?

[edit] 另一轮 RTFM'ing 给了我这个想法...

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                                   |
+-------------------------------------------------------+

看起来干净多了。有更好的想法吗?

您或许可以使用 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 时间戳值将相同。

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