2009-04-30 17 views
13

¿Hay alguna forma en mysql de calcular el desplazamiento para cualquier zona horaria? Por ejemplo, para obtener la hora local en la zona horaria 'Asia/Calcuta', lo que quiero hacer es calcular la compensación para esta zona horaria y agregar esa compensación a GMT para obtener la hora local.En MySQL cálculo de desplazamiento para un huso horario

Respuesta

11

Si desea calcular el desplazamiento de una zona horaria como America/Vancouver 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 la zona horaria en mysql como se describe aquí: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

-1
DATEDIFF(NOW(), UTC_TIMESTAMP()) 
+1

DATEDIFF devuelve la diferencia en días * * de horas o minutos .. – ColinM

5

El desplazamiento dependerá del tiempo que le interesa - por ejemplo, estaría actualmente tiene un desplazamiento de una hora de UTC, pero durante el invierno mi desplazamiento sería cero.

A juzgar por el docs page on MySQL time zone support, desea utilizar la función convert_tz. Si intenta convertir UTC a la hora local, pase "Etc/GMT + 0" como zona horaria "desde" y "Asia/Calcuta" como "a".

-1
SET time_zone = '-07:00'; 

Sólo puede pasar en un

compensar

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

+0

Esto no funciona tan bien como uno piensa .... –

+0

¡Nunca use la compensación para establecer una zona horaria! Use siempre el nombre, como "Europa/Praga". De lo contrario, se sorprenderá mucho cuando ocurra el horario de verano. –

7

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

Si la zona horaria del servidor es PST Esto devolverá -8.

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

sumar el resultado de lo anterior a cualquier marca de tiempo Unix si quieres compararlo con DateTime MySQL.

1

I mezclado respuestas de @ColinM y @Kenneth Spencer porque quería el desplazamiento 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ó que necesita para carga 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 la compensación 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')) 

Dar:

+-------------------+--------+ 
| Name    | Offset | 
+-------------------+--------+ 
| America/Denver |  -6 | 
| America/Vancouver |  -7 | 
| Etc/UTC   |  0 | 
+-------------------+--------+ 
0

Me pregunto si la respuesta de @ ColinM anterior es seguro. ¿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); 
+0

esto es mitad pregunta mitad respuesta – Drew

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

Dar

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

Por lo general, es una buena idea exponer el código en su respuesta. Cuéntanos cómo funciona o qué estás haciendo exactamente. Esto ayuda a los desarrolladores más nuevos a entender exactamente lo que está sucediendo. –

Cuestiones relacionadas