在MySQL计算时区的偏移量

时间:2009-04-30 06:08:20

标签: mysql timezone offset

在MySQL中有没有办法计算任何时区的偏移量? 例如,要获取时区中的本地时间Asia/calcutta。我想要做的是计算这个时区的偏移量,并将该偏移量添加到GMT以获得当地时间。

8 个答案:

答案 0 :(得分:13)

如果您想从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

答案 1 :(得分:12)

SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());

如果服务器的时区是PST,则会返回-8

SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());

如果要将其与MySQL DateTimes进行比较,请将上述结果添加到任何unix时间戳。

答案 2 :(得分:5)

偏移量取决于您感兴趣的时间 - 例如,我目前与UTC的偏移量为1小时,但在冬季,我的偏移量将为零。

根据docs page on MySQL time zone support判断,您想要使用convert_tz功能。如果您尝试将UTC转换为当地时间,请将“Etc / GMT + 0”作为“from”时区传递,将“Asia / Calcutta”作为“to”传递。

答案 3 :(得分:4)

SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;

给予

+--------+
| offset |
+--------+
|  05:30 |
+--------+

答案 4 :(得分:1)

我混淆了@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 |
+-------------------+--------+

答案 5 :(得分:0)

我想知道@ ColinM上面的答案是否安全。它读取时钟一次还是两次? UTC_TIMESTAMP()和NOW()有可能相隔一秒吗?我不知道,但这会避免这种情况。

SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);

答案 6 :(得分:-1)

DATEDIFF(NOW(), UTC_TIMESTAMP())

答案 7 :(得分:-1)

SET time_zone = '-07:00';

你可以传递一个偏移量

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html