11 jan

Horário de Verão e mktime em C

Fabio Mazzarino - 11/jan/2011

Doses Diárias, Programação, Unix -

Horário de Verão

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

Tags: , , ,

Deixe Seu Comentário

Pesquisar


Publicidade

  • Links

    • An error has occurred; the feed is probably down. Try again later.