Ir para o conteúdo
Leudassdf

[Resolvido] Comparar Duas datas

Mensagens Recomendadas

Leudassdf

Boas pessoal,

Eu fiz uma função para comparar duas datas do tipo char *;

No entanto aquilo que eu fiz foi "partir" o array de carateres por "-" para obter o dia,mes e o ano. EX:"05-02-2015" dia=5, mes=2, ano=2015

O principal problema da minha funcao é que tenho que estar sempre a partir as datas, a a fazer atois para converter para inteiro.

Isto torna-se um pouco eficiente uma vez que o eu tenho que chamar esta funcao milhares de vezes.

Será que alguém me conseguiria orientar de forma a fazer uma funcao mais eficiente?

As minhas funções sao estas:

typedef STRING char *
STRING *Partir_String(char *matricula, int n_campos_max, int *n_campos_lidos, char *separadores)
{
*n_campos_lidos = 0;
STRING *Res = (STRING *)malloc(n_campos_max*sizeof(STRING));
char *pch = strtok(matricula, separadores);
int cont = 0;
while (pch != NULL)
{
Res[cont] = (char *)malloc((strlen(pch) + 1)*sizeof(char));
strcpy(Res[cont++], pch);
pch = strtok(NULL, separadores);
}
*n_campos_lidos = cont;
return Res;
return NULL;
}
void auxMaiorData(STRING *LINHA,int n)
{
for (int i = 0; i < n; i++)
free(LINHA[i]);
free(LINHA);
}
short MaiorData(char *d1, char *d2)
{
char data1[12], data2[12];
strcpy(data1, d1);
strcpy(data2, d2);
unsigned int dia1, dia2, mes1, mes2, ano1, ano2;
int ncamposlidosDiaMes = 0;
STRING *LINHA = NULL;
LINHA = Partir_String(data1, 3, &ncamposlidosDiaMes, "-/\\n");
if (!(ncamposlidosDiaMes == 3))
return-1;
dia1 = atoi(LINHA[0]);
mes1 = atoi(LINHA[1]);
ano1 = atoi(LINHA[2]);
auxMaiorData(LINHA,ncamposlidosDiaMes); //faz os frees
LINHA = Read_Split_Line_Geral(data2 ,3, &ncamposlidosDiaMes, "-/\\n");
if (!(ncamposlidosDiaMes == 3))
return-1;
dia2 = atoi(LINHA[0]);
mes2 = atoi(LINHA[1]);
ano2 = atoi(LINHA[2]);
auxMaiorData(LINHA, ncamposlidosDiaMes); //faz os frees

bool condicoesData1MenorData2 = ano1 < ano2 || (ano1 == ano2 && mes1 < mes2) || (ano1 == ano2 && mes1 == mes2&&dia1 < dia2);
bool condicoesData1IgualData2 = ano1 == ano2 && mes1 == mes2 && dia1 == dia2;
if (condicoesData1IgualData2)
return 0;
else
if (condicoesData1MenorData2)
return 2;
else
return 1;
//-1 se houver erro
//deve retornar 1 se d1 for a maior
//deve retornar 0 se forem iguais
//deve retornar 2 d2 for maior que d1

}

Peço desculpa pelo codigo não estar identado mas não consigo fazer os Tabs não sei porque.

Cumprimentos,

Leandro

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

int comp_datas(char* data1, char* data2) {
 long long ndata1, ndata2;
 int year, month, day;

//  if (sscanf(data1, "&d-&d-&d", &year, &month, &day) != 3)
 if (sscanf(data1, "%d-%d-%d", &year, &month, &day) != 3)
   return -1;
 ndata1 = year * 10000 + month * 100 + day;

//  if (sscanf(data2, "&d-&d-&d", &year, &month, &day) != 3)
 if (sscanf(data2, "%d-%d-%d", &year, &month, &day) != 3)
   return -1;
 ndata2 = year * 10000 + month * 100 + day;

 return ndata1 - ndata2;
}

int main() {
 char** list = {"2015-12-12", "2015-10-10", "2015-11-11"};
 int i;

 qsort(comp_datas, 3, sizeof(char*), comp_datas);
 for (i = 0; i < 3; ++i)
   printf("data : %s\n", list[i]);

 return 0;
}

edit : corrigido o escape caracter do sscanf

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leudassdf

Obrigado. Penso apenas que te enganas-te ao colocar "&d-&d-&d" no sscanf....

Gostaria ainda que se possivel me explicasses que fórmula é essa e que valores pode tomar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Obrigado. Penso apenas que te enganas-te ao colocar "&d-&d-&d" no sscanf....

estavam errados para o meu exemplo mas, como podes ver, já tinha corrigido antes de o dizeres

Gostaria ainda que se possivel me explicasses que fórmula é essa e que valores pode tomar.

que fórmula ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leudassdf
Em 5/26/2015 às 12:12, HappyHippyHippo disse:

estavam errados para o meu exemplo mas, como podes ver, já tinha corrigido antes de o dizeres.

Não percebi. Nao deveria ser %d-%d-%d?

que fórmula ?

ndata2 = year * 10000 + month * 100 + day;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Não percebi. Nao deveria ser %d-%d-%d?

sim, já corrigi

ndata2 = year * 10000 + month * 100 + day;

o que achas que está a fazer ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leudassdf

o que achas que está a fazer ?

Sinceramente não sei. Nao percebo porqu estamos a multiplicar o ano por 10000 e o mes por 100

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

para separar as ordens de grandeza dos anos, meses e dias para que estas não interfiram na avaliação das datas


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leudassdf

para separar as ordens de grandeza dos anos, meses e dias para que estas não interfiram na avaliação das datas

já percebi.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.