Jump to content

Comparar duas datas


Leudassdf
 Share

Go to solution Solved by HappyHippyHippo,

Recommended Posts

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

Link to comment
Share on other sites

  • Solution
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

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
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
 Share

×
×
  • 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.