Mudanças entre as edições de "FuncoesDeTempoNoC"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 16: Linha 16:
 
Entretanto, a biblioteca [https://www.gnu.org/software/libc/manual/html_node/Date-and-Time.html#Date-and-Time 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.
 
Entretanto, a biblioteca [https://www.gnu.org/software/libc/manual/html_node/Date-and-Time.html#Date-and-Time 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.
  
=A struct tm que representa o tempo=
+
=A struct tm e a struct time_t que representa o tempo=
  
 
A struct tm, conforme [http://man7.org/linux/man-pages/man3/ctime.3.html manual] do linux possui a seguinte estrutura:
 
A struct tm, conforme [http://man7.org/linux/man-pages/man3/ctime.3.html manual] do linux possui a seguinte estrutura:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
/* definida em time.h */
+
/* definida em time.h - NÃO é necessário redefinir no seu código*/
 
struct tm {
 
struct tm {
 
               int tm_sec;    /* segundos (0-60) */
 
               int tm_sec;    /* segundos (0-60) */
Linha 32: Linha 32:
 
               int tm_yday;  /* dia do ano (0-365, 1 Jan = 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 */
 
               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 */
          };
+
};
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
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 a alguns exemplos mostrando como capturar o tempo do sistema por exemplo:
 +
 +
<syntaxhighlight lang=c>
 +
#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);
 +
}
 +
</syntaxhighlight>
 +
 +
 +
time_t te

Edição das 07h57min de 23 de novembro de 2018

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.

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 a alguns exemplos mostrando como capturar o tempo do sistema por exemplo:

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


time_t te