В MySQL вычисление смещения для часового пояса

StackOverflow https://stackoverflow.com/questions/805538

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

Если часовой пояс сервера — PST, это вернет -8.

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

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

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

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

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

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

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

Я перепутал ответы @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 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';

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

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

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

SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top