Salve ragazzi, sto scrivendo un programma in cui mi serve che venga calcolato il numero di giorni che intercorrono tra due date. Sto usando la libreria <ctime>, ma, effettuando vari controlli sul mio codice, ho notato che per i mesi di 30 giorni va tutto liscio, dato che inserendo ipoteticamente: 31/06/2013 e 01/07/2013 mi calcola 0 giorni, ma con il mese di Febbraio sorgono i problemi:
fino a 29 febbraio funziona bene (si accorge quando l'anno è bisestile o no) ma se disgraziatamente inserisco 30 o 31 febbraio, mi calcola i giorni come se esistessero realmente.
So che normalmente uno non inserirebbe mai queste date, ma penso che un codice ben fatto debba saper controllare qualsiasi situazione. Come posso risolvere? Pensavo di inserire un do-while per rieseguire il ciclo nel caso in cui una delle date sia 30 o 31 febbraio, ma mi sembra un po' macchinoso. Consigli?
#include <iostream>
#include <ctime>
#include <conio.h>
using namespace std;
int main() {
static struct tm data1, data2;
int g,m,a;
do{printf("Inserisci prima data: ");
scanf("%d/%d/%d", &g, &m, &a);
data1.tm_mday = g;
data1.tm_mon = m - 1;
data1.tm_year = a - 1900;
printf("Inserisci seconda data: ");
scanf("%d/%d/%d", &g, &m, &a);
data2.tm_mday = g;
data2.tm_mon = m - 1;
data2.tm_year = a - 1900;
printf("La differenza tra le due date e' di %d giorni\n", abs(difftime(mktime(&data1), mktime(&data2))/86400));
cout<<"\n\nRieseguire?";
}while(getch()!='n');
return 0;
}
L'output è questo
Inserisci prima data: 29/02/2013
Inserisci seconda data: 30/02/2013
La differenza tra le due date e' di 1 giorni
Rieseguire?Inserisci prima data: 29/02/2013
Inserisci seconda data: 31/02/2013
La differenza tra le due date e' di 2 giorni
Rieseguire?Inserisci prima data: 31/02/2013
Inserisci seconda data: 01/03/2013
La differenza tra le due date e' di 2 giorni
Rieseguire?