FuncoesDeTempoNoC

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

1 Introdução

Em vários projetos de desenvolvimento surge a necessidade de representar data e hora. Por exemplo, um evento em uma agenda eletrônica deve ter associado a ele uma data e hora do momento em que este evento acontece. É natural que se pense ema representação na forma de uma struct:

struct data_hora {
  int ano,
      mes,
      dia,
      hora,
      minuto,
      segundo
};

Entretanto, a biblioteca glibc da GNU já apresenta uma série de definições e funções sobre o tempo. É importante conhecê-las pois facilitarão o desenvolvimento dos programs no sentido que permitirão rapidamente ler a hora e data do sistema, computar intervalos de tempo, entre outras possibilidades.

2 A struct tm e a struct time_t que representa o tempo

A struct tm, conforme manual do linux possui a seguinte estrutura:

/* definida em time.h - NÃO é necessário redefinir no seu código*/
struct tm {
               int tm_sec;    /* segundos (0-60) */
               int tm_min;    /* minutos (0-59) */
               int tm_hour;   /* horas (0-23) */
               int tm_mday;   /* dia do mês (1-31) */
               int tm_mon;    /* mês (0-11) */
               int tm_year;   /* ano - 1900 */
               int tm_wday;   /* dia da semana (0-6, Domingo = 0) */
               int tm_yday;   /* dia do ano (0-365, 1 Jan = 0) */
               int tm_isdst;  /* flag de horário de verão (HV): 1-se é HV, 0-não é HV, -1 se não existe esta informação */
};

Esta estrutura permite representar a data/hora calendário que um ser humano consegue facilmente entender e utilizar.

Por questões de otimização esta não é a melhor forma de representar o tempo em um sistema computacional. Também não é apropriada para representar intervalos de tempo. Desta forma, a biblioteca apresenta a definição time_t que possui uma estrutura adequada para o sistema computacional operar. Na prática é um tipo inteiro que representa o número de segundos desde 1 de Janeiro de 1970.

Vamos um exemplo mostrando como capturar o tempo do sistema:

#include <stdio.h>
#include <time.h>

main()
{
  struct tm *minha_data;
  time_t data_hora;

  time(&data_hora); /* ler do sistema a data_hora em segundos desde 1 de janeiro de 1970 */

  printf ("data hora em segundos desde 1970: %ld\n", data_hora);

  minha_data = localtime(&data_hora); /* convert de data representada em time_t para data em struct tm */

  printf("Ano %d Mês %d Dia %d Hora %d Minuto %d\n", minha_data->tm_year,  minha_data->tm_mon,  minha_data->tm_mday,  minha_data->tm_hour,  minha_data->tm_min);
}

Note que tempo lido do sistema através da função time() está na forma de segundos desde 1970 (um valor inteiro). Este tempo é então convertido para uma struct tm que pode ser manipulado pelas granularidades ano, mês etc.

2.1 Comparando tempo de eventos

Suponha que para registrar eventos em uma agenda, foi decidido usar o time_t. A comparação se torna bastante simples. Vamos a um exemplo: