在一个时区的MySQL计算偏移量
有没有办法在mysql中计算任何时区的偏移量。 例如,要获取时区'亚洲/加尔各答'的本地时间,我想要做的是计算此时区的偏移量,并将该偏移量添加到GMT以获取当地时间。在一个时区的MySQL计算偏移量
如果要计算偏移一个时区,如美国/温哥华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
DATEDIFF(NOW(), UTC_TIMESTAMP())
偏移将取决于你感兴趣的时间 - 例如,我现在有一个从UTC一小时偏移,但在冬季我的偏移将为零。
通过docs page on MySQL time zone support来判断,您想使用convert_tz
函数。如果您尝试将UTC转换为本地时间,请将“Etc/GMT + 0”作为“from”时区,将“Asia/Calcutta”作为“to”传入。
这不工作,以及一个人认为.... – 2013-05-14 09:41:08
永远不要使用偏移量设置时区!始终使用名称,如“欧洲/布拉格”。否则,当DST发生时您会感到非常惊讶。 – 2014-01-07 22:38:15
SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());
如果服务器的时区是PST这将返回-8
。
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());
以上的结果,如果你想将其与MySQL的DateTime是否加入任何UNIX时间戳。
我混了@ColinM和@Kenneth斯宾塞的答案,因为我想以小时偏移任意时区:
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)
正如肯尼思指出你需要加载时区信息: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 |
+-------------------+--------+
不知上面@ ColinM的回答是安全的。它读取时钟一次还是两次?有没有可能,UTC_TIMESTAMP()和NOW()可能相隔一秒钟?我不知道但这会避免。
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
这是一半问题的一半答案 – Drew 2015-12-29 15:26:40
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
给予
+--------+
| offset |
+--------+
| 05:30 |
+--------+
DATEDIFF返回*天*区别不是几小时或几分钟.. – ColinM 2013-01-03 00:31:46