chester's blog

technology, travel, comics, books, math, web, software and random thoughts

Timefix (Ou: Acertando O Horário De Verão Em Java II)

| Comments

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):

  1. Adicionar o .jar no CLASSPATH. Ex.: export CLASSPATH=$CLASSPATH:timefix-1.0.jar
  2. 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 <span style="color:red">timefix</span> com.xyz.ClassePrincipalDaMinhaApp param1 param2 param3

Desenvolvedores de aplicações preocupados com a questão podem também efetuar a chamada ao método fixTimeZone() 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.

Comments