[C] Calcolo data
Salve a tutti!
Il mio problema è il seguente: dovrei scrivere un programma in C che calcoli la differenza tra due date (per esempio:
19-05-2012:11-29-30 e 18-04-2013:17-31-29 aventi il seguente formato: giorno-mese-anno:ora-minuti-secondi).
La mia idea è questa:
prima di tutto calcolo la differenza tra anno, mese, giorno, ora, minuti e secondi in questo modo
dove con "year_cur" intendo anno corrente ed "year" intendo un anno nel futuro e così via con gli altri dati.
poi faccio vari controlli, in questo modo:
come ragionamento dovrebbe funzionare, ma sono dubbioso nella parte "giorni < 0", cioè come faccio a gestire il casoin cui il giorno futuro sia minore di quello corrente?
Qualcuno mi può aiutare?
P.S. Forse potrebbe sembrare stupida come domanda, però non so più che pesci prendere...
Il mio problema è il seguente: dovrei scrivere un programma in C che calcoli la differenza tra due date (per esempio:
19-05-2012:11-29-30 e 18-04-2013:17-31-29 aventi il seguente formato: giorno-mese-anno:ora-minuti-secondi).
La mia idea è questa:
prima di tutto calcolo la differenza tra anno, mese, giorno, ora, minuti e secondi in questo modo
int anni = year - year_cur; int mesi = month - month_cur; int giorni = day - day_cur; int ore = hour - hour_cur; int minuti = min - min_cur; int secondi = sec - sec_cur;
dove con "year_cur" intendo anno corrente ed "year" intendo un anno nel futuro e così via con gli altri dati.
poi faccio vari controlli, in questo modo:
if(secondi < 0){ secondi + 60; minuti - 1; } else if(minuti < 0){ minuti + 60; ore - 1; } else if(ore < 0){ ore + 24; giorni - 1; } else if(giorni < 0){ if(check_mese[month-1] == 30){ giorni + 30; } else if(check_mese[month-1] == 31){ giorni + 31; } else if(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)){ giorni + 29; } else { giorni + 28; } mesi - 1; } else if(mesi < 0){ mesi + 12; anni - 1; }
come ragionamento dovrebbe funzionare, ma sono dubbioso nella parte "giorni < 0", cioè come faccio a gestire il casoin cui il giorno futuro sia minore di quello corrente?

Qualcuno mi può aiutare?
P.S. Forse potrebbe sembrare stupida come domanda, però non so più che pesci prendere...

Risposte
Non stai tenendo conto del caso in cui le date siano in ordine inverso; nel seguito ignorerò questo caso per semplicità.
Dovrei mettemi a pensarci per cambiarti il modo, in ogni caso puoi semplificare il tuo codice come ho scritto sotto:
Dovrei mettemi a pensarci per cambiarti il modo, in ogni caso puoi semplificare il tuo codice come ho scritto sotto:
giorni += check_mese[mouth-1]; \\ hai dimenticato l'uguale... if((mouth == 1) && (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) ++giorni;
Mi sono dimenticato scrivere che check_mese è un vettore di 12 elementi con scritto il numero di giorni per ogni mese
In che senso non sto tenendo conto il caso in cui le date sono in ordine inverso?
Comunque il resto del codice va bene?
EDIT: Mi sono dimenticato un'altra cosa:
dopo aver calcolato la differenza tra le due date vorrei trasformarla in giorni.
int check_mese[]={31,28,31,30,31,30,31,31,30,31,30,31}
"vict85":
Non stai tenendo conto del caso in cui le date siano in ordine inverso; nel seguito ignorerò questo caso per semplicità.
Dovrei mettemi a pensarci per cambiarti il modo, in ogni caso puoi semplificare il tuo codice come ho scritto sotto:
giorni += check_mese[mouth-1]; \\ hai dimenticato l'uguale... if((mouth == 1) && (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) ++giorni;
In che senso non sto tenendo conto il caso in cui le date sono in ordine inverso?
Comunque il resto del codice va bene?
EDIT: Mi sono dimenticato un'altra cosa:
dopo aver calcolato la differenza tra le due date vorrei trasformarla in giorni.
Se la data che tu consideri futuro è in realtà nel passato il risultato viene sbagliato. Il risultato corretto è quello che viene calcolando il risultato per le date scambiate e poi mettendolo negativo. Il resto dovrebbe funzionare.
L'unica cosa che avrei cambiato è mettere la data in una qualche struttura oppure esprimerla come semplice array.
La trasformazione in giorni mi sembra abbastanza facile. L'unica cosa è che se devi considerare anche ore, minuti e secondi hai bisogno di un double (forse potrebbe bastare un float).
L'unica cosa che avrei cambiato è mettere la data in una qualche struttura oppure esprimerla come semplice array.
La trasformazione in giorni mi sembra abbastanza facile. L'unica cosa è che se devi considerare anche ore, minuti e secondi hai bisogno di un double (forse potrebbe bastare un float).