2009-04-30 33 views
13

有没有办法在mysql中计算任何时区的偏移量。 例如,要获取时区'亚洲/加尔各答'的本地时间,我想要做的是计算此时区的偏移量,并将该偏移量添加到GMT以获取当地时间。在一个时区的MySQL计算偏移量

回答

11

如果要计算偏移一个时区,如美国/温哥华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
DATEDIFF(NOW(), UTC_TIMESTAMP()) 
+1

DATEDIFF返回*天*区别不是几小时或几分钟.. – ColinM 2013-01-03 00:31:46

5

偏移将取决于你感兴趣的时间 - 例如,我现在有一个从UTC一小时偏移,但在冬季我的偏移将为零。

通过docs page on MySQL time zone support来判断,您想使用convert_tz函数。如果您尝试将UTC转换为本地时间,请将“Etc/GMT + 0”作为“from”时区,将“Asia/Calcutta”作为“to”传入。

-1
SET time_zone = '-07:00'; 

你可以只传递一个偏移

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

+0

这不工作,以及一个人认为.... – 2013-05-14 09:41:08

+0

永远不要使用偏移量设置时区!始终使用名称,如“欧洲/布拉格”。否则,当DST发生时您会感到非常惊讶。 – 2014-01-07 22:38:15

7

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

如果服务器的时区是PST这将返回-8

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

以上的结果,如果你想将其与MySQL的DateTime是否加入任何UNIX时间戳。

1

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

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

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

这是一半问题的一半答案 – Drew 2015-12-29 15:26:40

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

给予

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