В MySQL caculating offset для часового пояса
Есть ли способ в mysql рассчитать смещение для любого часового пояса.
Например, чтобы получить местное время в часовом поясе "Азия/Калькутта", я хочу рассчитать смещение для этого часового пояса и добавить это смещение в GMT, чтобы получить местное время.
Ответы
Ответ 1
Если вы хотите рассчитать смещение часового пояса, такого как America/Vancouver, из 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
Ответ 2
SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());
Если часовой пояс сервера - это PST, это вернет -8
.
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());
Добавьте результат выше в любую временную метку unix, если вы хотите сравнить ее с MySQL DateTimes.
Ответ 3
Смещение будет зависеть от времени, которое вас интересует - например, в настоящее время у меня есть смещение в один час от UTC, но зимой мое смещение будет равным нулю.
Судя по странице docs по поддержке часового пояса MySQL, вы хотите использовать convert_tz
. Если вы пытаетесь преобразовать UTC в локальное время, перейдите в "Etc/GMT + 0" в качестве "от" часового пояса, а "Азия/Калькутта" - как "to".
Ответ 4
Я перепутал @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 |
+-------------------+--------+
Ответ 5
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
Предоставление
+--------+
| offset |
+--------+
| 05:30 |
+--------+
Ответ 6
Интересно, является ли ответ @ColinM выше безопасным. Он читает часы один или два раза? Есть ли вероятность, что UTC_TIMESTAMP() и NOW() могут быть разделены на одну секунду? Я не знаю, но это могло бы избежать этого.
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
Ответ 7
DATEDIFF(NOW(), UTC_TIMESTAMP())
Ответ 8
SET time_zone = '-07:00';
Вы можете просто передать смещение
http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html