题
在MySQL中有没有办法计算任何时区的偏移量?
例如,要获取时区 Asia / calcutta
中的本地时间。我想要做的是计算这个时区的偏移量,并将该偏移量添加到GMT以获得当地时间。
解决方案
如果您想从UTC计算美国/温哥华等时区的偏移量,您可以按以下方式进行:
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
为此,您首先需要将时区信息加载到mysql中,如下所示: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
其他提示
SELECT TIMESTAMPDIFF(HOUR,UTC_TIMESTAMP(),NOW());
如果服务器的时区是PST,则返回 -8
。
SELECT TIMESTAMPDIFF(SECOND,NOW(),UTC_TIMESTAMP());
如果要将其与MySQL DateTimes进行比较,请将上述结果添加到任何unix时间戳。
偏移量取决于您感兴趣的时间 - 例如,我目前与UTC的偏移量为1小时,但在冬季,我的偏移量将为零。
根据有关MySQL时区支持的文档页面判断,你想使用 convert_tz
功能。如果您尝试将UTC转换为本地时间,请传入“Etc / GMT + 0”。作为“来自”时区,和“亚洲/加尔各答”。作为“to”。
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
给予
+--------+
| offset |
+--------+
| 05:30 |
+--------+
我混淆了@ColinM和@Kenneth Spencer的答案,因为我希望在几个小时内偏移任意时区:
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "UTC", "America/Denver"))
-
SELECT ROUND(TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", "Asia/Kolkata"))/60,1)
正如Kenneth指出你需要加载时区信息: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
但是你可以做一些有趣的事情,比如一次找到多个时区的偏移量:
SELECT Name,
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", Name)) as Offset
FROM mysql.time_zone_name
WHERE (Name IN ('America/Vancouver', 'Etc/UTC', 'America/Denver'))
,并提供:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
我想知道@ ColinM上面的答案是否安全。它读取时钟一次还是两次? UTC_TIMESTAMP()和NOW()有可能相隔一秒吗?我不知道,但这会避免这种情况。
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);