ColdFusion e horário de verão

Entre ontem e hoje andou rolando uma discussão na CF-Brasil sobre uma repentina mudança de horário em servidores rodando ColdFusion, mesmo que o horário do servidor (Windows ou Linux) estivesse corretamente configurado. Muitas máquinas (a minha inclusive) deram um “salto” de uma hora e já estavam funcionando como se estivéssemos em horário de verão. Como eu sempre gerenciei servidores ColdFusion pré-MX, já tinha decorado que o horário do sistema operacional (incluindo time-zone) era determinante para o horário do CF. Não sei onde estava desde 2002, quando a Macromedia lançou o MX 6.0, o fato é que desde esta versão, o “horário” do CF não depende mais do sistema operacional que ele reside (apesar de inicializar-se usando como base as configurações deste), mas sim do JVM (que não deixa de ser o “sistema operacional” onde o CF reside). Por esta razão, por mais que se modificasse o horário do sistema operacional, o horário do CF mantinha-se o mesmo. Óbvio, claro, mas demorei para me tocar. Só hoje, quando vi que algumas das minhas schedule tasks estavam mandando “notícias” (eu costumo criar alertas de e-mail) cedo demais, é que percebi que algo estava errado. Mas não me lembrava bem o quê, mesmo já tendo feito um post relacionado, no passado recente.

O problema é que, da mesma maneira como acontece com o Windows, o JVM tem datas pré-determinadas para inicializar o horário de verão nos time-zones que o adotam. E no caso do time-zone de Brasília, usado pela maioria de nós, esta data era o dia 09/10. Por esta razão, recomenda-se configurar manualmente os argumentos de inicialização do JVM do CF, sobrescrevendo o time-zone que será lido do sistema operacional quando da inicialização do CF/JVM. Além de contornar o problema da data de início pré-definida de horário de verão pelo Java, que, não precisaria repetir, nunca bate com o que o nosso governo estipula (coisa típica do brasil…).

Pois aqui entra uma dica pessoal: ao invés de usar uma time-zone específica (ex America/Sao_Paulo), ou então outra qualquer (como Buenos_Aires, que é GMT+3 mas não tem horário de verão) para “burlar” o ajuste automátivo do Java, eu prefiro usar uma time-zone do tipo Etc/GMT, que não sofre esse tipo de alteração “não-avisada”, pré-programada. Para tal, basta adicionar ao campo Java Arguments do ColdFusion Administrator o seguinte (entendo-se que você queira configurá-lo para o “horário de Brasília”, que por padrão é GMT+3):

Para horário “normal”:

-Duser.timezone=Etc/GMT+3

Em horário de verão:

-Duser.timezone=Etc/GMT+2

Lembrem-se isso deve ser feito, manualmente, sempre quando houver a mudança de horário de verão (entrada ou saída). Para exemplificar, veja um print-screen de como está o Java Arguments do meu servidor neste exato momento (lembrando que ainda não estamos no horário de verão).

Note ainda que eu uso um outro argumento, o -Duser.country=BR, que fará o mesmo para o JVM, porém em termos de configurações regionais (formato de moeda, casas decimais, etc). Papo para outro dia.

Lembre-se de que, ao modificar os argumentos de inicialização, você deve ser cauteloso, caso contrário o servidor poderá não inicializar, nos casos onde você insere alguma coisa a mais ou de menos no JVM arguments. Ou ainda (na maioria das vezes) põe alguma coisa com formatação errada (comum em operações copy+paste). Para evitar isso, recomendo a leitura de um post antigo, sobre modificações que podem ser feitas para o JVM: Heap “agressivo” e mudanças nos settings de JVM.

Technote recomendado:

http://www.macromedia.com/go/tn_18310


4 Comments on “ColdFusion e horário de verão”

  1. walleska disse:

    nao e esatamente um comentario e uma pergunta.Quem enventou o horario de verao?

  2. Nagash disse:

    mas o horário de Brasilia num era GMT-3 ?

  3. Junior Matias disse:

    Supondo que vários clientes utilizam as configurações atuais do ColdFusion, então essa alteração pode interferir nas configurações atuais em outros clientes

    Tem alguma restrição no uso desse parametro?

  4. Paulo disse:

    Eu sei que esse post é antigo, mas me passaram para dar uma olhada. Veja na documentação do Java sobre uma classe que se chama TimeZone. Dê uma olhada nos métodos dele e veja se alguma coisa pode contribuir com uma solução melhor.

    http://java.sun.com/j2se/1.5.0/docs/api/java/util/TimeZone.html