19

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

4

8 回答 8

18

如果要计算时区(例如美国/温哥华)与 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

于 2012-03-14T17:11:41.967 回答
16

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

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

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

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

于 2013-01-03T00:39:05.987 回答
9
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;

给予

+--------+
| offset |
+--------+
|  05:30 |
+--------+
于 2017-03-09T11:23:09.627 回答
5

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

MySQL time zone support 的文档页面来看,您想要使用该convert_tz功能。如果您尝试将 UTC 转换为本地时间,请将“Etc/GMT+0”作为“从”时区传入,将“Asia/Calcutta”作为“至”传入。

于 2009-04-30T06:12:36.717 回答
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 |
+-------------------+--------+
于 2014-07-11T17:59:47.297 回答
0

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

SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
于 2015-12-29T15:24:50.330 回答
-1
DATEDIFF(NOW(), UTC_TIMESTAMP())
于 2009-04-30T06:12:02.083 回答
-1
SET time_zone = '-07:00';

你可以传入一个偏移量

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

于 2009-10-27T19:08:36.973 回答