mysql fusos horários

Como configurar o fuso horário do MySQL por nomes.

Se você pretende usar time zones ou fusos horários no MySQL, pelo nome, é bom ter certeza de que as tabelas contendo estas informações estão atualizadas e povoadas — prontas para uso.
Se você não tem certeza de que os nomes das zonas de fusos horários estão disponíveis — tanto para a configuração do servidor, quanto para uso dos clientes (que pretendem ajustar seus próprios fusos), — faça o seguinte teste, dentro do console do cliente MySQL:

SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+

No exemplo, acima, a função COUNT() retornou o valor 0 — o que indica a impossibilidade de se referenciar às zonas de fuso horário pelos seus nomes.
O segundo caso, do exemplo abaixo, fica evidenciado que a tabela de nomes de zonas de fusos horários está presente:

SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|     1790 |
+----------+

Neste texto, vamos nos debruçar sobre uma solução para o primeiro caso.
Fusos horários no MySQL

O processo de instalação do MySQL cria as tabelas de fusos horários (time zone tables), mas não carrega os valores para dentro delas — ou seja, não as povoa. Você precisa fazer isto manualmente, caso queira se referir aos fusos horários por nome.


  • Sistemas operacionais, como Linux, FreeBSD, Solaris e OSX têm sua própria base de dados zoneinfo, que consiste em um conjunto de arquivos descritores dos fusos horários. Neste caso, você pode usar o utilitário mysql_tzinfo_to_sql para preencher as tabelas de zonas de fusos.
    Para usuários Windows, é possível fazer o download do pacote de banco de dados de zonas de fusos horários para MySQL em http://dev.mysql.com/downloads/timezones.html.
    Neste texto, uso como exemplo, o sistema operacional GNU/Linux Ubuntu 14.04 LTS — portanto, o procedimento deve ser o mesmo para qualquer sistema baseado no Debian.

No Ubuntu 14.04 os arquivos zoneinfo, pode ser encontrados em /usr/share/zoneinfo/:

ls /usr/share/zoneinfo/
Africa      Chile    Factory    Iceland      MET       posix       UCT
America     CST6CDT  GB         Indian       Mexico    posixrules  Universal
Antarctica  Cuba     GB-Eire    Iran         MST       PRC         US
Arctic      EET      GMT        iso3166.tab  MST7MDT   PST8PDT     UTC
Asia        Egypt    GMT0       Israel       Navajo    right       WET
Atlantic    Eire     GMT-0      Jamaica      NZ        ROC         W-SU
Australia   EST      GMT+0      Japan        NZ-CHAT   ROK         zone.tab
Brazil      EST5EDT  Greenwich  Kwajalein    Pacific   Singapore   Zulu
Canada      Etc      Hongkong   Libya        Poland    SystemV
CET         Europe   HST        localtime    Portugal  Turkey

Veja, a seguir, como trabalhar com estes arquivos.

Como povoar o banco de dados usando o mysql_tzinfo_to_sql

Este processo é muito simples e rápido. Use a seguinte linha de comando:

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root -p mysql

O que o comando acima faz é “jogar” todos os arquivos do diretório /usr/share/zoneinfo/ (pode variar de acordo com o seu sistema), bem como de seus subdiretórios, dentro do banco de dados mysql, nas tabelas apropriadas.
Uma vez feito este procedimento, já é possível se referir aos fusos horários, dentro do MySQL, por seus nomes.

A documentação oficial do MySQL (link ao final do tópico), adverte para não baixar e usar pacotes, caso seu sistema operacional já tenha um banco de dados zoneinfo. Use o aplicativo utilitário mysql_tzinfo_to_sql.

Após a execução do comando mysql_tzinfo_to_sql, é recomendável reiniciar o servidor de banco de dados, para evitar que ele use dados de fusos horários contidos na cache:

sudo service mysql restart

Como ajustar o fuso horário no MySQL

Veja como é possível ajustar o fuso, referindo-se ao nome:

SELECT * FROM mysql.time_zone_name WHERE Name LIKE '%Fortaleza%';
_
+-------------------------+--------------+
| Name                    | Time_zone_id |
+-------------------------+--------------+
| America/Fortaleza       |          113 |
| posix/America/Fortaleza |          710 |
| right/America/Fortaleza |         1307 |
+-------------------------+--------------+
3 rows in set (0.00 sec)
SET time_zone='America/Fortaleza';
Query OK, 0 rows affected (0.00 sec)

SELECT @@time_zone;
_
+-------------------+
| @@time_zone       |
+-------------------+
| America/Fortaleza |
+-------------------+
1 row in set (0.00 sec)

No artigo Como ajustar o fuso horário ou a timezone no MySQL, você pode encontrar uma relação completa de fusos horários do Brasil e de outros países de língua portuguesa — além disto, há outros exemplos de uso e ajuste dos fusos horários no MySQL.

Referências: https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation.

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!

Deixe uma resposta

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