Este é um problema em como o Java determina o fuso horário em sistemas unix.
A especificação POSIX não especifica como determinar o fuso horário quando o ambiente TZ variável não está definida. Não consigo encontrar nada na Base do Linux sobre isso.
A biblioteca do sistema básico (GNU libc) usa /etc/localtime para determinar o fuso horário. Portanto, no Linux não integrado, /etc/localtime é onde as informações de fuso horário são armazenadas e, idealmente, a história terminaria aqui.
(Olhando em volta: FreeBSD, NetBSD e OpenBSD usam /etc/localtime . O Solaris e alguns outros usam /etc/TIMEZONE . O Rosetta Stone for Unix mostra o que outros unices usam. Dietlibc (usado em alguns sistemas Linux embarcados) usa /etc/localtime , enquanto uClibc usa /etc/TZ (a menos que corrigido ).)
Infelizmente, o Java faz as coisas de maneira diferente. O Debian e o Ubuntu têm um arquivo chamado /etc/timezone , que contém o nome do fuso horário. Esse arquivo extra destina-se ao sistema de empacotamento, para que ele se lembre de um nome geográfico como Europe/Amsterdam em vez de apenas a descrição do fuso horário (compensações ao longo do tempo e nomes de exibição CET , CEST e CEDT ). Isso é mais amigável para os humanos e robusto caso o local geográfico atualize suas regras de fuso horário. Sun (agora Oracle) Java prefere /etc/timezone (ou /etc/sysconfig/clock em distribuições baseadas no Red Hat) veja o bug # 6456628 para /etc/localtime , e OpenJDK e gcj sigam o exemplo. p>
Veja também: Como encontro o fuso horário do sistema atual? ; O Java Time Zone está confuso .
A solução é simples: sempre atualize /etc/timezone e /etc/localtime juntos. No Debian ou Ubuntu, o método oficial para mudar o fuso horário é dpkg-reconfigure tzdata . Para alterar o fuso horário apenas para um aplicativo, defina a variável de ambiente TZ (isso é portátil em todos os sistemas unix).