Horário de Verão e mktime em C
Fabio Mazzarino - 11/jan/2011
Doses Diárias, Programação, Unix -

Recentemente perdi um bom tempo tentando resolver um problema com mktime em C. Para que não conhece linguagem C, mktime é a função que converte uma struct tm, que representa uma data e hora, para time_t, que representa a quantidade de segundos desde 1970-Jan-01 00:00:00.
O problema que encontrei foi devido ao horário de verão. Quando eu interpretava um texto que continha uma data e hora, e tentava converter utilizando mktime, sempre ficava uma diferença de 3600 segundos, ou seja, 1 hora.
Depois de alguma pesquisa descobri um campo dentro da struct tm: tm_isdst. Este campo indica se o horário de verão está ou não ativo, por default contém zero, indicando que o horário de verão não está ativo. Mas como descobrir se o horário de verão é válido ou não?
A solução veio de uma leitura mais cuidadosa da manpage. A função mktime aceita tm_isdst com o valor -1, o que força a função a determinar por si só se o horário de verão está ativo ou não. Passando a utilizar este método o time_t passou a vir perfeitamente, sem nenhum tipo de variação.
Para a maioria das dúvidas uma boa lida no manual sempre resolve.
O código ficou mais ou menos assim:
date.tm_year = year - 1900; date.tm_mon = month - 1; date.tm_mday = day; date.tm_hour = hour; date.tm_min = minute; date.tm_sec = second; date.tm_isdst = -1; return mktime(&date);
Deixe Seu Comentário