Ano passado escrevi um texto sobre o problema do Java com o horário de verão, explicando as causas, apontando soluções comuns e sugerindo uma nova – cuja principal vantagem é dispensar alterações no código-fonte da aplicação afetada.
Sua maior desvantagem é que o arquivo com o código de correção tem que ser recompilado a cada mudança de regra do horário de verão (i.e., uma vez por ano, pelo menos) e re-copiado em cada servidor – o que fica complicado quando se cuida de dezenas ou centenas deles.
Em vista disso (e com a ajuda da classe ZoneInfo, de autoria de Stuart D. Gathman), criei o timefix – uma biblioteca que lê automaticamente o arquivo /etc/localtime
do servidor, ajusta o timezone default e chama a aplicação final. Desta forma, basta reiniciá-la quando o arquivo for atualizado parq que as novas datas de início e fim do horário de verão entrem em vigor.
A página do projeto no Google Code hospeda o código-fonte e a biblioteca compilada (disponíveis sob a licença LGPL).
Download e Instalação
Para usar, basta baixar o timefix-1.0.jar (ou a versão mais atual, se houver) e fazer duas mudanças no script de inicialização do servidor (ex.: no catalina.sh
do Tomcat, ou no /etc/init.d/minha_aplicacao
):
- Adicionar o .jar no CLASSPATH. Ex.:
export CLASSPATH=$CLASSPATH:timefix-1.0.jar
-
Colocar o texto “tiimefix” antes do nome da classe original. Por exemplo, se o script original era:
java com.xyz.ClassePrincipalDaMinhaApp param1 param2 param3
mude para:` java timefix com.xyz.ClassePrincipalDaMinhaApp param1 param2 param3
</li> </ol> Desenvolvedores de aplicações preocupados com a questão podem também efetuar a chamada ao método [
fixTimeZone()`]6 ao inicializar a mesma (ou em intervalos regulares, dispensando o restart quando houver mudança nas regras). Mas este método torna a aplicação dependente do SO hospedeiro (pessoalmente, não recomendo isso).Sistemas operacionais suportados
Esta solução só funciona em Linux e outros sistemas estilo Unix que usem o formato do banco de dados
tz
(e exige que o arquivo de timezone compilado – ou um link simbólico para ele – esteja no/etc/localtime
). Testei em Linux (Ubuntu 6.06.1 / Kernel 2.6.15) e em Mac OS X (10.4.8).Administradores de servidores Windows podem tentar criar o diretório
\etc\localtime
no drive onde a aplicação roda e copiar um arquivo de timezone compilado para lá (ex.: copiado de uma máquina Linux ou da web). Não tentei fazer isso, mas teoricamente funciona – se alguém fizer funcionar na prática vale deixar um comentário.