Alguém conhece o funcionamento da tabela de fuso horário no Linux?

Olá a todos,
Estou desenvolvendo a partir de um microcontrolador esp8266 node MCU um relógio que se ajusta sozinho a partir de uma conexão com a internet via wifi. Eu obtenho a hora via protocolo NTP mas estou tendo problemas para obter os fuso horários. Por enquanto contornei usando um serviço disponível na internet mas gostaria de implementar um modo melhor que use meios oficiais para obter os fuso horários. Alguém sabe qual o meio que as distribuições Linux usam para definir os fuso horários mundiais?

1 Curtida

Eu acho que não existe tal tabela. Os programas com esta finalidade geralmente só consultam um endereço específico no protocolo ‘ntp’, este que é responsável por fornecer a informação sobre a localidade pré estabelecida pelo usúario. O programa baseia-se no UTC pra encaminhar ao servidor correto.

1 Curtida

Posso estar errado, mas acho que o mais certo é que o servidor só fornece o horário em UTC então faz-se o calculo - acrescentando horas ou subtraindo horas - dependendo da localidade. O servidor geralmente, quando possível, é escolhido um de confiança numa menor distância, preferencialmente, para ser o mais preciso possível.

Então esse é o problema o UTC é obtido através do NTP pelos pools de cada país. Já os fusos são um pouco mais confusos. Eles variam por regiões e variam na mesma região devido ao horário de verão. Eu não encontrei nenhum serviço oficial que me informe o fuso horário. Eu gostaria de saber como o Linux obtém os fusos. Na minha pesquisa eu não descobri nenhum serviço como o UTC que fornece um horário padrão mundial. O UTC eu consegui obter pelo NTP usando um servidor brasileiro mas quando se trata do fuso parece que esses servidores não fornecem e se fornecem eu não descobri como obter.

@over.clk é isso mesmo. Pelo NTP se obtém o UTC. Depois disso você faz o cálculo do horário local usando o fuso que por exemplo para São Paulo é -3 no horário normal e -2 no horário de verão. Eu preciso de uma maneira confiável de obter esses fusos para fazer o cálculo local do horário.

Entendo, você está falando do horário local… como o Linux sabe o horário da regiões baseado na hora oficial. Eu também tenho essa dúvida, não sei nem se o linux é capaz de fazer tal “conversão” digamos assim.

No Windows tem um ‘check box’ referente ao ajuste de horário de verão. Não sei como é no Linux. No meu sistema só tem a opção “RTC is in local time”, e pra ser sincero não sei muito bem a que se refere. Acho que deva ser alguma definição de re-calculo baseando-se no UTC levando em consideração a hora oficial desta vez.

Ce quer uma coisa assim?
Tirei do The Linux Programming Interface, tem um capítulo dedicado a como obter e lidar com tempo, se pah te ajuda.

Pelo que tó vendo aqui, o brasil tem quatro fusos em UTC, então quando se configura isso você pode escolher de uma cidade que represente a UTC e fazer um calculo específico. Ou, escolher UTC (UTC -3) referente a Brasília e fazer um mais certeiro já que no oficial todos são baseados nele.

Já o horário de verão é definido pelo governo, e tem sua aplicação variável pelo governo. Você precisará defini-lo de tempo em tempo. Mas parece-me agora que o horário de verão não será mais aplicado com o atual governo.

Quando não há horário de verão é bem simples, você simplesmente usa a variação para cada fuso. Eu pesquisei o horário de verão e o problema é que ele é definido por lei nacional e nem sempre segue uma lógica fixa. Por exemplo ano passado foi alterado o início por causa do ENEM, esse ano parece que o novo governo aboliu o horário de verão. Isso muda de país para país. De alguma forma o Linux consegue contornar isso, e é isso que eu gostaria de saber como é feito. Por enquanto estou usando o serviço do timezonedb.com , mas eu gostaria de saber como é feito no sistema operacional para usar um meio mais confiável do que um serviço que pode sair do ar a qualquer momento e que é pago se usado em larga escala.

O RTC é um relógio local que funciona independente da internet. Ele é um chip que armazena a hora localmente e faz a contagem pela frequência de uma corrente elétrica.

@Fenrir, dei uma olhada no arquivo /usr/share/zoneinfo/Sao_Paulo . Trata-se de um arquivo compilado. Seria necessário o código fonte de como isso é feito.

Essa informação deve ser de competência de algum pacote no linux. E ela é atualizada conforme os fusos locais vão mudando. Acredito que deve procurar por informações sobre pacotes como o ‘ntp’ pra saber como funciona.

Acredito que os critérios utilizados pra isso já seria “outros 500”, como de onde vem as referencias utilizadas… aí você vai se aprofundar mesmo…

Realmente é algo bem específico, @over.clk @Fenrir valeu a ajuda, vou continuar pesquisando.

Ah, vc pode ler o bytes do arquivos pra pegar informações, man tzfile tem as informações de como o arquivo é composto, mas provavelmente isso daria trabalho demais, então provavelmente algo assim seria mais útil? Eu realmente recomendo que vc leia o livro, tem praticamente tudo que vc precisa saber sobre a interface Linux.

Dê atenção a estes pacotes…

tzdata
This package contains data required for the implementation of standard local time for many representative locations around the globe. It is updated periodically to reflect changes made by political bodies to time zone boundaries, UTC offsets, and daylight-saving rules.

tzwatch
This shell script displays the time and date of time zones specified by the user. The time zones may be entered by hand in TZ format or chosen from a list prepared from /usr/share/zoneinfo/zone.tab. The zone list is kept in a format consistent with the GTK+ application gworldclock.

Como você pode ver, a tabela do Linux pode ser conferida em ‘/usr/share/zoneinfo/zone.tab’.

Talvez aqui tenha a informação que vc precisa.

https://wiki.archlinux.org/index.php/System_time#Time_zone

PS: Qualquer duvida de linux, principalmente técnica, o wiki do arch é o melhor lugar para começar a pesquisa.