bcouto Posted July 15, 2012 at 01:34 AM Report Share #468683 Posted July 15, 2012 at 01:34 AM 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 More sharing options...
KTachyon Posted July 15, 2012 at 09:55 AM Report Share #468690 Posted July 15, 2012 at 09:55 AM 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 More sharing options...
bcouto Posted July 15, 2012 at 11:50 AM Author Report Share #468700 Posted July 15, 2012 at 11:50 AM Ou fazes as contas, ou guardas a data noutro formato mais simples de tratar (tipo segundos/milissegundos). fazer as contas como? Link to comment Share on other sites More sharing options...
bcouto Posted July 15, 2012 at 12:03 PM Author Report Share #468701 Posted July 15, 2012 at 12:03 PM fazer as contas como? Se guardar a data noutro formato que abordagem posso ter para saber o número de dias que passaram? Link to comment Share on other sites More sharing options...
KTachyon Posted July 15, 2012 at 12:06 PM Report Share #468702 Posted July 15, 2012 at 12:06 PM 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 More sharing options...
HappyHippyHippo Posted July 15, 2012 at 12:12 PM Report Share #468703 Posted July 15, 2012 at 12:12 PM (edited) 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 July 15, 2012 at 12:13 PM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bcouto Posted July 20, 2012 at 09:02 PM Author Report Share #469435 Posted July 20, 2012 at 09:02 PM (edited) 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 July 20, 2012 at 09:06 PM by bcouto Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 20, 2012 at 10:11 PM Report Share #469443 Posted July 20, 2012 at 10:11 PM 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; } 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Dr_Lion Posted July 21, 2012 at 02:33 PM Report Share #469524 Posted July 21, 2012 at 02:33 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now