fusos horários - mysql

Como ajustar o fuso horário ou timezone no MySQL

O MySQL vai usar as datas e horas do sistema, caso não seja instruído a proceder de outra maneira. Se você estiver rodando um aplicativo cliente em uma zona com fuso horário diferente do do servidor MySQL, pode alterar manualmente a hora, com a função DATE_ADD().
Linguagens de script, como PHP, Python ou Perl, têm suas próprias funções para ajustar o fuso horário no cliente.
Neste artigo vamos abordar uma técnica manual, que pode ser útil para resolver o problema rapidamente e outras voltadas para quem deseja “resolver e esquecer” — ou seja, usar uma solução definitiva.

O sistema operacional, sobre o qual o servidor MySQL está rodando, afeta os valores usados pelo banco de dados — se seu fuso horário estiver ajustado para SYSTEM. Neste caso, o ajuste pode ser feito no sistema operacional.
Se você substituir o arquivo de sistema de definição de fuso horário, /etc/localtime por outro que tenha regras diferentes, será necessário reiniciar o mysqld para que suas informações sejam atualizadas no servidor MySQL.

fusos horários - mysql

Ajuste o fuso horário com DATE_ADD()

Esta pode ser uma forma rápida de obter uma solução — em que basta adicionar ou deduzir a quantidade de horas necessárias para obter o valor de data/hora correto.
Veja como acrescentar 2 horas a todos os horários de uma coluna em uma tabela (CadastroClientes):

SELECT NomeCliente AS Cliente,
    ->  TIME(DataCadastroCliente) AS "Check in time",
    ->  TIME(DATE_ADD(DataCadastroCliente, INTERVAL +2 HOUR)) AS "Hora local do Check in"
    ->  FROM CadastroClientes LIMIT 10;
+--------------------+---------------+------------------------+
| Cliente            | Check in time | Hora local do Check in |
+--------------------+---------------+------------------------+
| Christen Wiggins   | 10:03:39      | 12:03:39               |
| Justine Howard     | 21:44:49      | 23:44:49               |
| Brenda Ellis       | 11:58:30      | 13:58:30               |
| Hayfa Mendoza      | 20:52:29      | 22:52:29               |
| Kylie Mckay        | 09:43:57      | 11:43:57               |
| Fredericka Fuller  | 15:33:51      | 17:33:51               |
| Gretchen Bartlett  | 17:02:54      | 19:02:54               |
| Fiona Chen         | 20:28:20      | 22:28:20               |
| Lacy Holland       | 02:00:29      | 04:00:29               |
| Karleigh Contreras | 01:06:55      | 03:06:55               |
+--------------------+---------------+------------------------+
10 rows in set (0.00 sec)

O artigo Como converter horas em segundos minutos e dias aborda a função TIME() e dá outros exemplos de operações aritméticas envolvendo as horas.
Esta abordagem não é a melhor, quando a carga de serviço é grande. Além disso, fazer “trabalho manual e repetitivo” vai contra a nossa cultura hacker. 😉
Veja, nos próximos tópicos, algumas formas de solucionar o problema mais eficientemente.

Ajuste a variável time_zone de fuso horário no MySQL

Captura de tela - MySQL set global time_zone
Clique para ver detalhes.

A variável time_zone pode ser ajustada direto no console do cliente MySQL.
Verifique a sua hora atual com a função NOW(), antes de começar a brincar:

SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2015-07-02 19:37:57 |
+---------------------+
1 row in set (0.01 sec)

Em seguida, altere a variável global de fuso horário e desconecte do servidor:

SET @@global.time_zone = '+3:00';
QUIT

Você precisa sair e entrar de novo na sua sessão MySQL para poder ver os efeitos.
Assim que reiniciar a sessão do MySQL, verifique novamente a hora atual:

SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2015-07-02 22:38:29 |
+---------------------+
1 row in set (0.00 sec)

Se você tiver o banco de dados de nomes de zonas de fusos horários adequadamente configurado, pode se referir às zonas pelos seus nomes. Veja um exemplo:

SET time_zone='America/Sao_Paulo';
Query OK, 0 rows affected (0.01 sec)
SELECT @@time_zone;
+-------------------+
| @@time_zone       |
+-------------------+
| America/Sao_Paulo |
+-------------------+
1 row in set (0.00 sec)

Para poder se referir a um nome de zona de fuso horário, como ‘Brazil/DeNoronha’, você precisa estar com o banco de dados de nomes de timezones corretamente configurado. Se você tiver dúvidas sobre este assunto, ou não estiver conseguindo usar os nomes das zonas de fusos, leia este artigo.
Para ver todos os fusos válidos para o Brazil, por exemplo, use a seguinte query:

SELECT * FROM mysql.time_zone_name WHERE Name LIKE '%Brazil%';
+------------------------+--------------+
| Name                   | Time_zone_id |
+------------------------+--------------+
| Brazil/Acre            |          360 |
| Brazil/DeNoronha       |          361 |
| Brazil/East            |          362 |
| Brazil/West            |          363 |
| posix/Brazil/Acre      |          957 |
| posix/Brazil/DeNoronha |          958 |
| posix/Brazil/East      |          959 |
| posix/Brazil/West      |          960 |
| right/Brazil/Acre      |         1554 |
| right/Brazil/DeNoronha |         1555 |
| right/Brazil/East      |         1556 |
| right/Brazil/West      |         1557 |
+------------------------+--------------+
12 rows in set (0.00 sec)

Ajuste o arquivo de configuração my.cnf

Você pode selecionar um fuso horário pro servidor MySQL diferente do usado pelo sistema no qual ele se encontra instalado. Para isto, indique o fuso horário desejado, dentro do arquivo /etc/mysql/my.cnf, sob a variável default-time-zone.
Veja um exemplo:

[mysqld]
default-time-zone = Europe/Lisbon

Para que o comando acima funcione adequadamente, é necessário que as tabelas de timezones estejam completas e preenchidas.
Há outros valores, para quem se encontra em país de língua portuguesa:

  • Africa/Luanda
  • America/Campo_Grande
  • America/Bahia
  • America/Belem
  • America/Boa_Vista
  • America/Cuiaba
  • America/Fortaleza
  • America/Manaus — Brazil/West
  • America/Noronha — Brazil/DeNoronha
  • America/Porto_Acre — Brazil/Acre
  • America/Porto_Velho
  • America/Recife
  • America/Rio_Branco — Brazil/Rio_Branco
  • America/Santarem
  • America/Sao_Paulo — Brazil/East
  • Brazil/Acre
  • Brazil/DeNoronha
  • Brazil/East
  • Brazil/Rio_Branco
  • Brazil/West
  • Athlantic/Cape_Verde

Se você usa Ubuntu ou outra distro GNU/Linux baseada no Debian, pode encontrar uma relação completa de zonas de fusos horários em /usr/share/zoneinfo.
Depois de alterar o arquivo my.cnf, reinicie o servidor MySQL:

sudo service mysql stop
sudo service mysql start

mysql start/running, process 11885

Entre novamente no cliente MySQL e verifique o seu novo fuso horário:

NOW();

ou

select @@time_zone;
+------------------+
| @@time_zone      |
+------------------+
| Europe/Stockholm |
+------------------+
1 row in set (0.00 sec)

Como você pode perceber, no exemplo acima, alterei o fuso horário para o de Estocolmo (Suécia).
Quando você cansar de brincar, basta remover (ou comentar, com um ‘#’) a referência ao fuso horário no arquivo my.cnf e reiniciar o servidor MySQL — e este voltará a usar o fuso horário do sistema:

select @@time_zone;
+-------------+
| @@time_zone |
+-------------+
| SYSTEM      |
+-------------+

Se você quiser entender melhor o uso do arquivo de configuração my.cnf, leia o artigo Use um arquivo de configuração pessoal para se conectar ao MySQL.

Referẽncias:
https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
http://stackoverflow.com/questions/930900/how-to-set-time-zone-of-mysql

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como “Rick and Morty” e “BoJack Horseman”.
Me siga no Twitter e vamos trocar ideias!

One thought on “Como ajustar o fuso horário ou timezone no MySQL”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *