2009-04-30 98 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 | 
+--------+