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