En MySQL Cálculo de desplazamiento para una zona horaria
Pregunta
¿Hay alguna forma en MySQL para calcular el desplazamiento para cualquier zona horaria?
Por ejemplo, para obtener la hora local en la zona horaria Asia / calcutta
. Lo que quiero hacer es calcular el desplazamiento para esta zona horaria y agregar ese desplazamiento a GMT para obtener la hora local.
Solución
Si desea calcular el desplazamiento de una zona horaria como America / Vancouver desde UTC, puede hacerlo de la siguiente manera:
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
Para que esto funcione, primero deberá cargar la información de zona horaria en mysql como se describe aquí: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
Otros consejos
SELECT TIMESTAMPDIFF (HOUR, UTC_TIMESTAMP (), NOW ());
Si la zona horaria del servidor es PST, devolverá -8
.
SELECT TIMESTAMPDIFF (SECOND, NOW (), UTC_TIMESTAMP ());
Agregue el resultado de lo anterior a cualquier marca de tiempo de Unix si desea compararla con MySQL DateTimes.
El desplazamiento dependerá de la hora que te interese, por ejemplo, actualmente tengo un desplazamiento de una hora desde UTC, pero durante el invierno mi desplazamiento sería cero.
A juzgar por la página de documentos sobre el soporte de la zona horaria de MySQL , desea utilizar convert_tz
. Si está intentando convertir UTC a la hora local, ingrese " Etc / GMT + 0 " como el " a partir de " zona horaria, y " Asia / Calcuta " como " a " ;.
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
Dando
+--------+
| offset |
+--------+
| 05:30 |
+--------+
Mezclé las respuestas de @ColinM y @Kenneth Spencer porque quería la compensación de una zona horaria arbitraria en horas:
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)
Como Kenneth señaló, deberá cargar la información de la zona horaria: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
Pero luego puedes hacer cosas divertidas como encontrar el desplazamiento para varias zonas horarias a la vez:
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'))
Dando:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';
Puedes pasar un offset
http://dev.mysql.com /doc/refman/5.1/en/time-zone-support.html
Me pregunto si la respuesta de @ColinM es segura. ¿Lee el reloj una o dos veces? ¿Hay alguna posibilidad de que UTC_TIMESTAMP () y NOW () puedan estar separados por un segundo? No lo sé, pero esto evitaría eso.
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);