PDA

Visualizza la versione completa : Calcolo fra date


massimo.case
28-02-2002, 16:30
Ciao ragazzi,

Il mio problema è il seguente:
devo calcolare quanti giorni, ore, minuti e secondi ci sono fra queste due date es. 2002-01-12 13:20:15 e 2002-02-28 11:23:00

qualcuno conosce una funzione per fare ciò? E come si usa?

Grazie e ciao Max

Dhavide
01-03-2002, 09:01
Ciao,

Prima di discutere la formula che ti serve, faccio un paio di osservazioni. Innazitutto, il codice che vado a presentarti è abbastanza universale, nel senso che vale per qualsiasi coppia di date "dopo ******", per intenderci; se quello che serve a te è qualcosa di circoscritto ad un numero molto limitato di anni, il codice potrebbe essere ridotto.

Detto questo facciamo un altro discernimento: ogni anno ha 365 giorni, a parte gli anni bisestili che ne hanno uno in più; di anni bisestili ce ne sono uno ogni quattro, con delle eccezioni, ossia, gli anni secolari non divisibili per 400 non sono bisestili, quindi l' anno 100 NON è bisestile, il 200 NEMMENO, il 300 NEANCHE, il 400 SI.

Detto questo, e considerato che in un giorno vi sono (60 * 60 * 24 =) 86.400 secondi, creaiamo il codice che segue.

Definiamo ur array che chiameremo giornipassati:

giornipassati = array ();
giornipassati [1] = 31;
giornipassati [2] = 59;
giornipassati [3] = 90;
giornipassati [4] = 120;
giornipassati [5] = 151;
giornipassati [6] = 181;
giornipassati [7] = 212;
giornipassati [8] = 243;
giornipassati [9] = 273;
giornipassati [10] = 304;
giornipassati [11] = 334;

Come possiamo notare questo array contiene alla generica posizione i il numero di giorni passati dal 01 gennaio all' ultimo giorno del mese i stesso; non ho inluso dicembre (12) in quanto non serve ai fini del nostro codice.

Ora valutiamo le nostre due date, considerandole già scomposte in variabili, in modo che la data 1 sia rappresentabile come qualcosa del tipo

G1 / M1 / A1, H1 : Min1 : Sec1

e la data 2, analogamente,

G2 / M2 / A2, H2 : Min2 : Sec2

(p.s.: queste due righe sono solo simboliche, non devono essere inserite nel codice ;) )

Ora, per calcolare la nostra differenza, facciamo prima un calcolo un po' astruso, per il quale avrai bisogno di un tipo di variabile molto "capiente", ti consiglio comunque un tipo floating-point come una double o più.

Il calcolo che ora faremo non farà altro che calcolare il numero di secondi che sono trascorsi dal 01/01/01, 00:00 fino alla nostra data:

giorni1 = (A1 * 365) + (A1 div 4) + (A1 div 400) - (A1 div 100) + giornipassati [M1 - 1] + G1;
secondi1 = (giorni1 * 86400) + (H1 * 3600) + (Min1 * 60) + Sec1;

giorni2 = (A2 * 365) + (A2 div 4) + (A2 div 400) - (A2 div 100) + giornipassati [M2 - 1] + G2;
secondi2 = (giorni2 * 86400) + (H2 * 3600) + (Min2 * 60) + Sec2;

Bene, ora calcoliamo la differenza tra le due date che ora, nelle variabili secondi1 e secondi2, saranno espresse in soli secondi:

diff = abs (secondi2 - secondi1);

Ed ora scomponiamo il tutto:

Giorni = diff div 86400;
diff = diff mod 86400;
Ore = diff div 3600;
diff = mod 3600;
Minuti = diff div 60;
Secondi = diff mod 60;

Ovviamente con div intendiamo la divisione intera, mentre con mod indichiamo il resto di una divisione intera.

Spero di essere stato sufficientemente esaustivo, altrimenti ... siamo qui!

Ciao Ciao by Dhavide - eternamente diviene