Algumas vezes você precisa mudar o arquivo timezone para se adequar as regras/leis regionais, como em:

Histórico: O Debian inclui arquivos timezone na árvore de diretório /usr/share/zoneinfo, que é fornecida pelo pacote tzdata para o Etch e posteriores. (Para o Sarge e anteriores os arquivos são parte do libc6). Esses pacotes podem ser atualizados periodicamente:

Para fazer uma mudança antes da mudança feita pelo projeto Debian, siga este processo:

Mais detalhes podem ser encontrados abaixo, usando Sydney Australia como exemplo. Substitua o nome do fuso horário e o nome do arquivo pela sua região.

Verificar Fuso Horário Configurado

Para verificar ou mudar o fuso horário para o qual seu sistema Debian está configurado,

# dpkg-reconfigure tzdata

O que isso faz? Isso muda o /etc/localtime. O detalhes da mudança segue:

Nas versões do Debian Etch e posteriores, o /etc/localtime é uma cópia do arquivo de dados original. Verifique o conteúdo de /etc/timezone para ver o nome do fuso horário. Se o sistema estiver configurado normalmente, você deverá descobrir que o arquivo zoneinfo referenciado por este nome é idêntico ao /etc/localtime. Por exemplo, você pode verificar isso executando:

$ diff -s /etc/localtime /usr/share/zoneinfo/`cat /etc/timezone`
Files /etc/localtime and /usr/share/zoneinfo/America/New_York are identical

O comando tzconfig atualiza tanto o /etc/localtime quanto o /etc/timezone.

Nas versões Sarge e anteriores, o /etc/localtime é um link para um arquivo. Verifique para onde o /etc/localtime linka:

# ls -l /etc/localtime
lrwxrwxrwx    1 root     root           48 Mar 31 11:19 /etc/localtime -> /usr/share/zoneinfo/Australia/Sydney

Verifique Se Necessário

O programa zdump copia a tabela de fuso horário. Use-o para verificar as datas da mudança de horário de verão. Por exemplo, este sistema tem regras australianas antigas, mostrando uma mudança do horário de verão em 26 de março:

# zdump -c 2007 -v Australia/Sydney|grep 2006
Australia/Sydney  Sat Mar 25 15:59:59 2006 UTC = Sun Mar 26 02:59:59 2006 EST isdst=1 gmtoff=39600
Australia/Sydney  Sat Mar 25 16:00:00 2006 UTC = Sun Mar 26 02:00:00 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 15:59:59 2006 UTC = Sun Oct 29 01:59:59 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 16:00:00 2006 UTC = Sun Oct 29 03:00:00 2006 EST isdst=1 gmtoff=39600

Obter o Arquivo de Fuso Horário

Obtenha uma cópia do arquivo de fuso horário "australasia" ou específico do país de um pacote tzdata recente ou do site upstream.

Para obter o arquivo australasia das origens tzdata, configure seu sources.list com linhas deb-src para sua versão de distribuição atual, busque a fonte, descompacte-a e edite o arquivo. Por exemplo, em um sistema Debian Lenny (números de versão podem variar):

# mkdir /tmp/tzdata
# cd /tmp/tzdata
# apt-get install dpkg-dev
# apt-get source tzdata
# cd tzdata-2008e
# tar xfz tzdata2008e.tar.gz
# more australasia

Para contornar o Debian e pegar os arquivos de onde o projeto Debian os tirou:

% mkdir /tmp/tzdata
% cd /tmp/tzdata
% wget 'ftp://elsie.nci.nih.gov/pub/tzdata*.tar.gz'
% tar xfz tzdata*.tar.gz
% more australasia

Agora você deve ter todos os arquivos de fuso horário.

Se você estiver usando o arquivo do pacote de origem sem a alteração, altere o arquivo adicionando as novas linhas. Por exemplo, estas linhas estão no arquivo corrigido para a mudança do início de 2006 em australasia:

...
Rule    AN      2001    max     -       Oct     lastSun 2:00s   1:00    -
Rule    AN      2006    only    -       Apr     Sun>=1  2:00s   0       -
Rule    AN      2007    max     -       Mar     lastSun 2:00s   0       -
...

Mudança para teste prévio

Este é um passo adicional. Isto testa o arquivo fonte sem mudar a configuração do sistema. E pode ser feito por um usuário sem privilégios administrativos.

$ mkdir test-tz
$ /usr/sbin/zic -d test-tz australasia
$ TZ=`pwd`/test-tz/Australia/Sydney date --date="2006-04-01 16:00:10 UTC"
Sun Apr  2 02:00:10 EST 2006

Este teste compila o arquivo do fuso horário em um diretório, e então pede ao comando date para passar do horário UTC para o horário local próxima da descontinuidade esperada.

Submeter as Mudanças

O programa zic muda as tabelas de fuso horário. Dê à ele o nome do arquivo fonte modificado da australasia ou específico do país. Por exemplo:

# /usr/sbin/zic australasia

Então reconfigure o pacote tzdata, o qual atualizará /etc/localtime:

# dpkg-reconfigure tzdata

Teste de Verificação 1: Mostre as Regras do Fuso Horário

Use o programa zdump novamente para confirmar a mudança. Por exemplo este sistema teve as mudanças aplicadas apropriadamente, mostrando uma mudança de horário de verão em 2 de abril:

# zdump -c 2007 -v Australia/Sydney|grep 2006
Australia/Sydney  Sat Apr  1 15:59:59 2006 UTC = Sun Apr  2 02:59:59 2006 EST isdst=1 gmtoff=39600
Australia/Sydney  Sat Apr  1 16:00:00 2006 UTC = Sun Apr  2 02:00:00 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 15:59:59 2006 UTC = Sun Oct 29 01:59:59 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 16:00:00 2006 UTC = Sun Oct 29 03:00:00 2006 EST isdst=1 gmtoff=39600

Teste de Verificação 2: Traduza o Horário UTC

Você pode usar a opção --date no comando date para ver como o sistema interpretará um horário específico. Este método não muda o relógio do sistema.

$ date --date="2006-04-01 15:59:50 utc"
Sun Apr  2 02:59:50 EST 2006
$ date --date="2006-04-01 16:00:10 utc"
Sun Apr  2 02:00:10 EST 2006

Teste de Verificação 3: Observar a Mudança

É possível alterar o horário do seu sistema para demonstrar que a correção é boa. Há efeitos colaterais de alterar o horário, como a distorção de datas de arquivos ou problemas de interoperabilidade com outros sistemas próximos, por isso é apenas uma boa ideia em um sistema de teste.

Para fazer o teste, use o comando date --utc para alterar a hora para um pouco antes da primeira descontinuidade identificada por zdump, depois use o comando date para mostrar a hora local, após a descontinuidade. Por exemplo:

# date --utc 040115592006.50 ; date ; sleep 20 ; date
Sun Apr  2 02:59:50 EST 2006
Sun Apr  2 02:00:10 EST 2006

Cenários de Falha de Testes

* definir a hora no formato UTC usando o sinalizador --utc é útil, porque definir o horário como 02:59:50 seria ambíguo e o comando date significa o segundo 02:59:50 naquela manhã ao invés do primeiro, e a mudança não seria percebida.

Reiniciar Daemons e Programas de Execução Longa

Depois que os arquivos zoneinfo forem atualizados, talvez seja necessário reiniciar os daemons e outros programas de execução longa para que eles usem as novas informações do fuso horário. Exemplos de tais programas incluem apache, bind, cron, fetchmail-d, inetd, mailman, sendmail, e sysklogd. Um sintoma comum desse problema é ver registros de data e hora incorretos misturados com os registros de data e hora corretos em seus arquivos de registro (por exemplo, /var/log/syslog). Mesmo programas interativos como o mutt podem continuar usando as informações antigas de fuso horário até que sejam reiniciadas.

Portabilidade Binária

O arquivo zoneinfo compilado parece ser independente de plataforma e arquitetura, portanto, se você tiver várias máquinas para atualizar, poderá mover o arquivo como está, sem executar o zic novamente. Da mesma forma, você pode simplesmente extrair arquivos atualizados do zoneinfo de uma máquina rodando uma versão diferente do Debian, ou até mesmo baixar o mais recente pacote tzdata da versão instável, extrair o arquivo zoneinfo de dentro do arquivo .deb, e instale-os na árvore de diretórios /usr/share/zoneinfo.

Referencias