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.

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top