PDA

Visualizza la versione completa : [C/C++] confrontare... date file e date http


yag
30-07-2003, 09:21
allora sono incasinatissimo
ho fatto un programma che via http recupera un file
tramite l'header mi prendo il campo last-modified

poi prendo la data di un file dal disco ora devo confrontare le due date
solo che :
quella del protocollo č cosė:
"Wed, 26 Feb 2003 19:22:35 GMT\0"

quella del file č cosė
"00/00/0 00:00" (nn fate a caso a 00 ecc.)
sono disperato nn so proprio come fare
mi date una mano

nn ho trovato un funzione che fa al caso mio ho cercato anche su msdn

Johnny_Depp
30-07-2003, 09:32
in generale:

devi standardizzare e splittare le 2 stringhe...

nel senso che devi estrapolare day, month, year, hour, minute
sia dalla stringa1 che dalla stringa2 (quindi da 2 variabili,
ne ricaverai 10... day1, day2 ecc...)

una volta standardizzate le varie stringhe (es: gen == 00, feb == 01)
le converti da tipo stringa in tipo numerico e poi le confronti.

yag
30-07-2003, 09:41
Originariamente inviato da Johnny_Depp
in generale:

devi standardizzare e splittare le 2 stringhe...

nel senso che devi estrapolare day, month, year, hour, minute
sia dalla stringa1 che dalla stringa2 (quindi da 2 variabili,
ne ricaverai 10... day1, day2 ecc...)

una volta standardizzate le varie stringhe (es: gen == 00, feb == 01)
le converti da tipo stringa in tipo numerico e poi le confronti.
č proprio questo , ma nn so come farlo nn esiste qualche funzione che mi formatta allo stesso modo entrambe le stringhe ?

(stiamo parlando in c/c++)

akiross
30-07-2003, 11:13
bhe, in time.h ci sono un paio di funzioni che restituiscono delle stringhe in formato testo, a seconda dei parametri che gli dai

se non erro si chiama asctime

puoi scegliere il formato passando delle stringhe come
"%g/%m/%y %H:%N:%S"

adesso ti sto facendo un esempio, probabilmente questi parametri non fanno cio' che vuoi, ma se guardi bene tra le opzioni possibili, probabilmente trovi quello che fa al caso tuo

ciao

yag
30-07-2003, 11:17
Originariamente inviato da akiross
bhe, in time.h ci sono un paio di funzioni che restituiscono delle stringhe in formato testo, a seconda dei parametri che gli dai

se non erro si chiama asctime

puoi scegliere il formato passando delle stringhe come
"%g/%m/%y %H:%N:%S"

adesso ti sto facendo un esempio, probabilmente questi parametri non fanno cio' che vuoi, ma se guardi bene tra le opzioni possibili, probabilmente trovi quello che fa al caso tuo

ciao
asctime(const struct tm *__tblock);
nn esiste partono tutte da una struttura tm che non ho
l'unica cosa che ho provato a fare e
convertire un stringa in time_t castando a long
e poi tramite la time_t ottenere una tm ma da risultati sballati!

akiross
30-07-2003, 11:25
si, in effetti non e' cosi' immediata l'utilizzo della time
beccati questo esempio che mi ero fatto per me


int main(int argc, char *argv[])
{
tm tempo;
time_t data;
data = time(NULL); // oppure time(&data);
tempo = *gmtime(&data);
cout << asctime(&tempo); // va a capo da sola
char string[41];
strftime(string, 41, "%A %d %B %Y", &tempo);
/* MANUALE pas 747
%a = Mon
%A = Monday
%b = Gen
%B = Genuary
%c = stringa standard per data e ora
%d = giorno del mese 1-31
%H = ora 0-23
%m = mese 1-12
%M = minuto 0-59
%S = secondo 0-59
%Y = anno XXXX
%y = anno XX
*/
cout << string << endl;
return 0;
}


ciao

yag
30-07-2003, 11:27
Originariamente inviato da akiross
si, in effetti non e' cosi' immediata l'utilizzo della time
beccati questo esempio che mi ero fatto per me


int main(int argc, char *argv[])
{
tm tempo;
time_t data;
data = time(NULL); // oppure time(&data);
tempo = *gmtime(&data);
cout << asctime(&tempo); // va a capo da sola
char string[41];
strftime(string, 41, "%A %d %B %Y", &tempo);
/* MANUALE pas 747
%a = Mon
%A = Monday
%b = Gen
%B = Genuary
%c = stringa standard per data e ora
%d = giorno del mese 1-31
%H = ora 0-23
%m = mese 1-12
%M = minuto 0-59
%S = secondo 0-59
%Y = anno XXXX
%y = anno XX
*/
cout << string << endl;
return 0;
}


ciao
ok queste cose le sapevo ma nn ho ancora risolto il mio problema

Johnny_Depp
30-07-2003, 12:40
devi fare una cosa del genere:

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


void std_date_format(char *s1, char *s2);


int main()
{
char str1[]="Wed, 26 Feb 2003 12:22:35 GMT\0";
char str2[]="26/02/03 16:22"; // dd/mo/yy/ hh:mm

//trasforma entrambe le stringhe nel seg. formato (dd mo yy hh mm)

std_date_format(str1, str2);

system("PAUSE");
return 0;
}






void std_date_format(char *s1, char *s2)
{
char dd1[3], mo1[3], yy1[3], hh1[3], mm1[3];
char dd2[3], mo2[3], yy2[3], hh2[3], mm2[3];

int idd1, imo1, iyy1, ihh1, imm1;
int idd2, imo2, iyy2, ihh2, imm2;

int i=0;





//standardizzo STR1


while(1) // catturo dd1
{
if(s1[i] <= '9' && s1[i] >= '0')
{
dd1[0]=s1[i];
dd1[1]=s1[++i];
dd1[2]='\0';
break;
}
i++;
}

i++;

while(1) // catturo mo1 (Gen==00, Feb==01, Mar==02, Apr==03, ecc...)
{
if(s1[i] == 'G' && s1[i+1] == 'e' && s1[i+2] == 'n')
{
mo1[0]='0';
mo1[1]='1';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'F' && s1[i+1] == 'e' && s1[i+2] == 'b')
{
mo1[0]='0';
mo1[1]='2';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'M' && s1[i+1] == 'a' && s1[i+2] == 'r')
{
mo1[0]='0';
mo1[1]='3';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'A' && s1[i+1] == 'p' && s1[i+2] == 'r')
{
mo1[0]='0';
mo1[1]='4';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'M' && s1[i+1] == 'a' && s1[i+2] == 'y')
{
mo1[0]='0';
mo1[1]='5';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'J' && s1[i+1] == 'u' && s1[i+2] == 'n')
{
mo1[0]='0';
mo1[1]='6';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'J' && s1[i+1] == 'u' && s1[i+2] == 'l')
{
mo1[0]='0';
mo1[1]='7';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'A' && s1[i+1] == 'u' && s1[i+2] == 'g')
{
mo1[0]='0';
mo1[1]='8';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'S' && s1[i+1] == 'e' && s1[i+2] == 'p')
{
mo1[0]='0';
mo1[1]='9';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'O' && s1[i+1] == 'c' && s1[i+2] == 't')
{
mo1[0]='1';
mo1[1]='0';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'N' && s1[i+1] == 'o' && s1[i+2] == 'v')
{
mo1[0]='1';
mo1[1]='1';
mo1[2]='\0';
i=i+2;
break;
}
else if(s1[i] == 'D' && s1[i+1] == 'e' && s1[i+2] == 'c')
{
mo1[0]='1';
mo1[1]='2';
mo1[2]='\0';
i=i+2;
break;
}

i++;
}

i++;

while(1) // catturo yy1
{
if(s1[i] <= '9' && s1[i] >= '0')
{
yy1[0]=s1[i+2];
yy1[1]=s1[i+3];
yy1[2]='\0';
i=i+3;
break;
}
i++;
}

i++;

while(1) // catturo hh1
{
if(s1[i] <= '9' && s1[i] >= '0')
{
hh1[0]=s1[i];
hh1[1]=s1[++i];
hh1[2]='\0';
break;
}
i++;
}

i++;

while(1) // catturo mm1
{
if(s1[i] <= '9' && s1[i] >= '0')
{
mm1[0]=s1[i];
mm1[1]=s1[++i];
mm1[2]='\0';
break;
}
i++;
}




//standardizzo STR2


i=0;

while(1) // catturo dd2
{
if(s2[i] <= '9' && s2[i] >= '0')
{
dd2[0]=s2[i];
dd2[1]=s2[++i];
dd2[2]='\0';
break;
}
i++;
}

i++;

while(1) // catturo mo2
{
if(s2[i] <= '9' && s2[i] >= '0')
{
mo2[0]=s2[i];
mo2[1]=s2[++i];
mo2[2]='\0';
break;
}
i++;
}

i++;

while(1) // catturo yy2
{
if(s2[i] <= '9' && s2[i] >= '0')
{
yy2[0]=s2[i];
yy2[1]=s2[++i];
yy2[2]='\0';
break;
}
i++;
}

i++;

while(1) // catturo hh2
{
if(s2[i] <= '9' && s2[i] >= '0')
{
hh2[0]=s2[i];
hh2[1]=s2[++i];
hh2[2]='\0';
break;
}
i++;
}

i++;

while(1) // catturo mm2
{
if(s2[i] <= '9' && s2[i] >= '0')
{
mm2[0]=s2[i];
mm2[1]=s2[++i];
mm2[2]='\0';
break;
}
i++;
}


printf("STR1 : %s %s %s %s %s\n", dd1, mo1, yy1, hh1, mm1);
printf("STR2 : %s %s %s %s %s\n", dd2, mo2, yy2, hh2, mm2);


// CONFRONTO LE 2 DATE (stringhe)

idd1=atoi(dd1);
imo1=atoi(mo1);
iyy1=atoi(yy1);
ihh1=atoi(hh1);
imm1=atoi(mm1);

idd2=atoi(dd2);
imo2=atoi(mo2);
iyy2=atoi(yy2);
ihh2=atoi(hh2);
imm2=atoi(mm2);


if(iyy1 > iyy2)
{
printf("\nSTR1 maggiore di STR2\n");
}
else if(iyy1 < iyy2)
{
printf("\nSTR1 minore di STR2\n");
}
else
{
if(imo1 > imo2)
{
printf("\nSTR1 maggiore di STR2\n");
}
else if(imo1 < imo2)
{
printf("\nSTR1 minore di STR2\n");
}
else
{
if(idd1 > idd2)
{
printf("\nSTR1 maggiore di STR2\n");
}
else if(idd1 < idd2)
{
printf("\nSTR1 minore di STR2\n");
}
else
{
if(ihh1 > ihh2)
{
printf("\nSTR1 maggiore di STR2\n");
}
else if(ihh1 < ihh2)
{
printf("\nSTR1 minore di STR2\n");
}
else
{
if(imm1 > imm2)
{
printf("\nSTR1 maggiore di STR2\n");
}
else if(imm1 < imm2)
{
printf("\nSTR1 minore di STR2\n");
}
else
{
printf("\nSTR1 uguale a STR2\n");
}
}
}

}

}


}

akiross
30-07-2003, 16:27
ok queste cose le sapevo ma nn ho ancora risolto il mio problema

e perche'?
e' semplice:
la tua stringa e' in formato:
"Wed, 26 Feb 2003 19:22:35 GMT\0"

invece l'altro e' nel formato:
"DD/MM/Y hh:mm"

detto questo
1. Estrai dalla 2o formato i numeri, fallo con gli stringstream, con la sscanf, come vuoi.

2. Metti quei numerini nella struttura time_t ( o tm)

3. Usi la funzioncina che ti ho dato per ricavare una stringa nello stesso formato della prima

4. strcmp e vedi se coincidono (se vuoi ometti le parti che non interessano, tipo GMT/0, sempre se non ti serve)

ciao

akiross
30-07-2003, 16:30
oh bhe, oppure usi la funzione che ha fatto Jony_depp, anche se supongo che quello che propongo io e' piu' compatto, ma piu' intricato

ciao

Loading