Jump to content

Contagem de dias entre duas datas. Alguma forma genérica?


bcouto

Recommended Posts

Boa noite.

Na resolução de um algoritmo de listas ligadas, tenho uma estrutura que regista vários dados, entre os quais a data actual do sistema com o include<time.h>.

Desta forma:

typedef struct emprestimo{

            char datareq[80];

            }
ficha_emprestimo;


ficha_emprestimo *adiciona()
_int64 rawtime;
 struct tm *r;

time (&rawtime);

r= localtime ( &rawtime );

strftime(e.datareq,80,"%d-%m-%Y",r);
printf("Data de Requisição:%s",e.datareq);

A data fica como string, neste caso.

Gostaria de saber se existe alguma maneira genérica que conte a diferença entre os dias,meses e anos, por exemplo, eu adiciono hoje ao campo datareq da lista ligada a data do sistema que é 15-07-2012, ficando esta registada e guardada. Se carregar para o programa a lista ligada no dia 17-07-2012(como poderia ser daqui a um ano em 17-07-2013), a data do sistema será 17-07-2012, existe alguma forma automática que me diga que passaram 2 dias? :s

A função seguinte seria a função que após o carregamento da lista ligada através de um ficheiro de texto, me diria quantos dias passaram. Sei que para obter os números inteiros da string poderei sempre fazer o casting int() do indice correspondente da string.


no_emprestimo *EntregaEmprestimos(no_emprestimo *plista)
{ 


no_emprestimo *aux=plista, *ant=NULL;
char codigo[18],now[80];
int i;
struct tm *n;
_int64 rawtime;
time (&rawtime);
n= localtime ( &rawtime );
strftime(now,80,"%d-%m-%Y",n);
printf("\nData Actual:%s",now);
/*Existe alguma forma de saber a diferença entre esta data com a introduzida noutro dia qualquer na lista ligada?*/



Não sei se fui o mais explícito e sintético possível para que percebam a minha dúvida.

Saudações 😉

Link to comment
Share on other sites

Ou fazes as contas, ou guardas a data noutro formato mais simples de tratar (tipo segundos/milissegundos).

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Basicamente, tens que desenvolver um algoritmo que consegue calcular a diferença através das 3 componentes (dia, mês e ano).

Tens um array com os dias que cada mês tem, e tens que ter em conta o número de dias de Fevereiro nos anos bissextos. Depois utilizas um ciclo para somar os dias.

Noutro formato, como o número de segundos desde 1 de Janeiro de 1970, só tens que fazer o cálculo da diferença para obteres o número de segundos entre duas datas e, a partir do valor dessa diferença, consegues calcular os dias de diferença.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

struct tm start, end, diff;

memset(&start, 0, sizeof(struct tm));
memset(&end, 0, sizeof(struct tm));

start.tm_year = 112; // 1900 + 112 = 2012
start.tm_mon = 0; // 0-11 = janeiro
start.tm_day = 2; // 1-31 = 2

end.tm_year = 112; // 1900 + 112 = 2012
end.tm_mon = 1; // 0-11 = fevereiro
end.tm_day = 3; // 1-31 = 3

diff = localtime(difftime(mktime(&start), mktime(&end)));

printf("ano(s) de diferença : %d\n", diff.tm_year);
printf("mes(es) de diferença : %d\n", diff.tm_mon);
printf("dia(s) de diferença : %d\n", diff.tm_mday);

PS : não testado

Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

struct tm start, end, diff;

memset(&start, 0, sizeof(struct tm));
memset(&end, 0, sizeof(struct tm));

start.tm_year = 112; // 1900 + 112 = 2012
start.tm_mon = 0; // 0-11 = janeiro
start.tm_day = 2; // 1-31 = 2

end.tm_year = 112; // 1900 + 112 = 2012
end.tm_mon = 1; // 0-11 = fevereiro
end.tm_day = 3; // 1-31 = 3

diff = localtime(difftime(mktime(&start), mktime(&end)));

printf("ano(s) de diferença : %d\n", diff.tm_year);
printf("mes(es) de diferença : %d\n", diff.tm_mon);
printf("dia(s) de diferença : %d\n", diff.tm_mday);

PS : não testado

Boas HappyHippyHippo, só agora consegui ver se funciona o código que postou, há dias, e pelo que vi não funciona.

Eu estava a guardar as datas como string, mas agora guardo os dados numa estrutura desta forma para uma lista ligada.

struct tm *d;


time (&rawtime);
d= localtime ( &rawtime );

d= localtime (&rawtime);
e.dataent.dia=d->tm_mday;
e.dataent.mes=d->tm_mon+1;
e.dataent.ano=d->tm_year+1900;
printf("\nData de Entrega:%d-%d-%d\n",e.dataent.dia,e.dataent.mes,e.dataent.ano);


aux->emp=e;
aux->next=plistaemp;

Isto é a função que introduz, automaticamente, o localtime na data de entrega da lista ligada. Agora eu queria criar uma nova função que usada noutro dia, o localtime seria diferente, me permitisse calcular o número de dias que existem de diferença entre a primeira data e a segunda.

Exemplo:

Hoje, nesta inserção para lista ligada a data será 20-07-2012, usando essa tal função de cálculo posterior, usada apenas para saber a diferença de dias, amanhã o localtime é 21-07-2012 e gostaria de obter o output de 1 dia. Para saber a diferença entre as datas usando para os dois casos o localtime em situações diferentes, até porque a primeira data já está na inserida na lista ligada e a segunda é apenas pontual para executar o cálculo.

Não sei se haverá uma maneira genérica para obter essa diferença.

Senão houver gostaria de saber se me davam umas luzes de como fazer as contas para ver a diferença entre as datas, precisava mesmo disso e não sei como fazer --.

Agradecido.

Edited by bcouto
Link to comment
Share on other sites

desta vez testei

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

int main() {
struct tm start, end;

memset(&start, 0, sizeof(struct tm));
memset(&end, 0, sizeof(struct tm));

start.tm_year = 112; // 1900 + 112 = 2012
start.tm_mon = 0; // 0-11 = janeiro
start.tm_mday = 2; // 1-31 = 2

end.tm_year = 113; // 1900 + 112 = 2012
end.tm_mon = 1; // 0-11 = fevereiro
end.tm_mday = 3; // 1-31 = 3

printf("diferenca de dias: %d\n", abs(mktime(&start) - mktime(&end)) / (60*60*24));

return 0;
}
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Guarda a data como time_t em vez de string, que já te permite usar a funcao difftime para saberes quantos segundos existem entre as duas, (não sei se há funções para retornarem os dias e meses etc).

Usa o locale apenas quando queres fazer o display da data, (não tenho a certeza se existe uma função para fazer o display sem o locale, mas se existir deve ser o strptime ou o strftime.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.