De onde o zdump está obtendo todas essas transições de tempo?

2

Eu recentemente escrevi algum código para analisar os dados binários do fuso horário do Banco de dados do Olson zoneinfo. Tanto quanto eu posso dizer, meu código está correto e corresponde a a especificação escrita em C.

No entanto, obtenho resultados diferentes ao comparar os resultados da minha ferramenta com a saída da ferramenta padrão zdump ! Isso é estranho, porque me parece que estamos trabalhando com os dados. Veja o que minha ferramenta produz:

$ ./mytool /usr/share/zoneinfo/Pacific/Honolulu
3137684296: name:HDT   offset:-34200 DST:true  type:Wall
3139531096: name:HST   offset:-37800 DST:false type:Wall
3414769096: name:HDT   offset:-34200 DST:true  type:Wall
3529591096: name:HST   offset:-37800 DST:false type:Wall
3582817096: name:HST   offset:-36000 DST:false type:Wall

E aqui está o que o zdump me dá:

$ zdump -v /usr/share/zoneinfo/Pacific/Honolulu
/usr/share/zoneinfo/Pacific/Honolulu  Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Apr 30 12:29:59 1933 UTC = Sun Apr 30 01:59:59 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Apr 30 12:30:00 1933 UTC = Sun Apr 30 03:00:00 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun May 21 21:29:59 1933 UTC = Sun May 21 11:59:59 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun May 21 21:30:00 1933 UTC = Sun May 21 11:00:00 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Feb  9 12:29:59 1942 UTC = Mon Feb  9 01:59:59 1942 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Feb  9 12:30:00 1942 UTC = Mon Feb  9 03:00:00 1942 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun Sep 30 11:29:59 1945 UTC = Sun Sep 30 01:59:59 1945 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu  Sun Sep 30 11:30:00 1945 UTC = Sun Sep 30 01:00:00 1945 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Jun  8 12:29:59 1947 UTC = Sun Jun  8 01:59:59 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Sun Jun  8 12:30:00 1947 UTC = Sun Jun  8 02:30:00 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Mon Jan 18 03:14:07 2038 UTC = Sun Jan 17 17:14:07 2038 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu  Tue Jan 19 03:14:07 2038 UTC = Mon Jan 18 17:14:07 2038 HST isdst=0

Há um lote mais dados lá! E 14 linhas não é um múltiplo de 5 linhas, então eu realmente tenho que perguntar - onde está obtendo todos esses dados? O zdump consulta alguma outra fonte de dados que eu não conheço?

O mais estranho é que, para alguns arquivos zoneinfo, os resultados parecem mais ou menos corretos. Mas o que é estranho para mim é que todos os timestamps Unix que estou reportando são todos no futuro . Alguém que conhece o banco de dados tz melhor do que eu explica esse comportamento estranho?

    
por Ben S 04.06.2015 / 03:21

1 resposta

3

O Zdump reporta uma "transição" extra falsa no início e no final do intervalo de 32-bit time_t. Isso explica os valores de 1901 e 2038, e por que ele mostraria 7 transições em vez de 5. Também informa as traduções de tempo em pares - uma imediatamente antes e uma imediatamente após cada transição. Portanto, você ganha 14 em vez de apenas 7.

A propósito, você deve estar ciente de que o zdump não funciona iterando diretamente sobre o conteúdo dos arquivos zoneinfo, mas sim tentando vários valores time_t com a função localtime. Desta forma, funciona tão bem com os especificadores TZ do estilo POSIX como com os arquivos reais do zoneinfo. (Eu também modifiquei uma vez para relatar transições para fusos horários nativos do Windows, portanto, não depende de nenhum interno de zona de informações)

A razão pela qual todos os timestamps de sua ferramenta estão "no futuro" é porque você está interpretando erroneamente valores negativos (todas as transições de Pacific / Honolulu são anteriores a 1970) como valores não assinados.

    
por 04.06.2015 / 06:18

Tags