Mudanças entre as edições de "FuncoesDeTempoNoC"
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