Pergunta

Existe uma maneira no MySQL para calcular o deslocamento para qualquer fuso horário? Por exemplo, para obter a hora local na Asia/calcutta fuso horário. O que eu quero fazer é calcular o deslocamento para este fuso horário e acrescentar que compensar a GMT para obter o tempo local.

Foi útil?

Solução

Se você quiser calcular o deslocamento de um fuso horário, como América / Vancouver a partir UTC você pode fazê-lo da seguinte forma:

SELECT (unix_timestamp() -  unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600   as offset;

Para que isso funcione, primeiro você terá de carregar as informações de fuso horário em mysql, conforme descrito aqui: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

Outras dicas

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

Se fuso horário do servidor é PST isso irá retornar -8.

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

Adicione o resultado do acima exposto a qualquer timestamp Unix Se você quer compará-lo com MySQL DateTimes.

O deslocamento vai depender do tempo que você está interessado em -., Por exemplo, eu tenho atualmente um deslocamento de uma hora do UTC, mas durante o inverno a minha compensação seria zero

A julgar pelo href="http://mysql.openmirrors.org/doc/refman/5.1/en/time-zone-support.html" página docs com o apoio de fuso horário MySQL , você quer usar o função convert_tz . Se você está tentando converter UTC para a hora local, passar em "Etc / GMT + 0" como o "de" fuso horário, e "Asia / Calcutta" como o "a".

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

Dar

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

eu misturei as respostas de @ColinM e @Kenneth Spencer porque eu queria o deslocamento de um fuso horário arbitrário em 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 apontou que você precisa para carregar a informação de fuso horário: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

Mas, então, você pode fazer coisas divertidas como encontrar o deslocamento para vários fusos horários ao mesmo tempo:

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 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';

Você pode simplesmente passar em um deslocamento

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

Gostaria de saber se resposta da @ ColinM acima é seguro. Será que ler o relógio uma ou duas vezes? Existe alguma possibilidade de que UTC_TIMESTAMP () e NOW () poderia ser um segundo de diferença? Eu não sei, mas isso evitaria isso.

SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top