В MySQL расчетное смещение для часового пояса - PullRequest
13 голосов
/ 30 апреля 2009

Есть ли в MySQL способ рассчитать смещение для любого часового пояса? Например, чтобы получить местное время в часовом поясе Asia/calcutta. Я хочу вычислить смещение для этого часового пояса и добавить это смещение к GMT, чтобы получить местное время.

Ответы [ 8 ]

13 голосов
/ 14 марта 2012

Если вы хотите рассчитать смещение часового пояса, например, Америки / Ванкувера, из 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

12 голосов
/ 03 января 2013

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

Если часовой пояс сервера равен PST, будет возвращено -8.

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

Добавьте результат вышеупомянутого к любой временной метке Unix, если вы хотите сравнить ее с MySQL DateTimes.

5 голосов
/ 30 апреля 2009

Смещение будет зависеть от времени, которое вас интересует - например, в настоящее время у меня будет смещение на один час от UTC, но зимой мое смещение будет равно нулю.

Судя по странице документации по поддержке часового пояса MySQL , вы хотите использовать функцию convert_tz. Если вы пытаетесь преобразовать UTC в местное время, передайте «Etc / GMT + 0» как часовой пояс «from», а «Asia / Calcutta» как «to».

4 голосов
/ 09 марта 2017
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;

Предоставление

+--------+
| offset |
+--------+
|  05:30 |
+--------+
1 голос
/ 11 июля 2014

Я перепутал ответы @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)

Как отметил Кеннет, вам нужно загрузить информацию о часовом поясе: 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 голосов
/ 29 декабря 2015

Интересно, является ли ответ @ ColinM выше безопасным. Он читает часы один или два раза? Есть ли вероятность того, что UTC_TIMESTAMP () и NOW () могут быть на расстоянии одной секунды? Я не знаю, но этого избежать.

SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
0 голосов
/ 27 октября 2009
SET time_zone = '-07:00';

Вы можете просто передать смещение

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

0 голосов
/ 30 апреля 2009
DATEDIFF(NOW(), UTC_TIMESTAMP())
...