[C] Calcolo data

DamianFox
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
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... :oops:

Risposte
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;

DamianFox
Mi sono dimenticato scrivere che check_mese è un vettore di 12 elementi con scritto il numero di giorni per ogni mese

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.

vict85
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).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.