Por padrão, (pelo menos em instalações baseadas em Debian) nenhum dado de fuso horário é carregado no MySQL. Se você quiser testar se eles estão carregados, tente executar:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Se retornar um
DATETIME
(neste caso 2012-06-07 08:00:00
), você tem fusos horários carregados. Se retornar NULL
, não são. Quando não carregado, você está limitado a converter usando deslocamentos (por exemplo, +10:00
ou -6:00
). Isso deve funcionar bem em muitos casos, mas há momentos em que é melhor usar fusos horários nomeados, como para não se preocupar com o horário de verão. A execução do seguinte comando carrega os dados de fuso horário do sistema (somente Unix. Não tenho certeza de qual seria o comando equivalente do Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Se você precisar confiar continuamente nos fusos horários do MySQL, o comando acima deve ser executado toda vez que o fuso horário do sistema for atualizado . Você também pode adicioná-lo a um cron job semanal ou mensal para fazer isso automaticamente.
Em seguida, para visualizar uma lista de fusos horários, faça o seguinte:
USE mysql;
SELECT * FROM `time_zone_name`;
Observe que as informações de fuso horário ocupam cerca de 5 MB no MySQL. Se você quiser descarregar as informações de fuso horário, basta executar o seguinte e reiniciar o MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Não
DROP
estas tabelas ou coisas ruins acontecerão. Editar:
Com base em um comentário de usuário abaixo, se você deseja que os fusos horários sejam atualizados automaticamente ao atualizar o sistema, primeiro você precisa permitir que o root faça login sem que seja solicitada uma senha.
MySQL>=5.6.6
Execute a seguinte [fonte ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Crie um
~/.my.cnf
arquivo (se ainda não existir) e adicione o seguinte:[client]
user=root
password=yourMysqlRootPW
Em seguida, execute
chmod 600 ~/.my.cnf
para garantir que ninguém mais possa lê-lo. Atualizar script
Adicione o seguinte script ao crontab para ser executado uma vez por dia:
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24
# hours and do not have ".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
echo "Updating MySQL timezone info"
# Note, suppressing STDERR here because of the .tab files above
# that cause warnings.
mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
echo "Done!\n"
fi
Remova o
echo
linhas se você não quiser nenhuma saída. Nota:Este é (principalmente) não testado. Deixe-me saber se você tiver algum problema e eu atualizarei esta resposta.