Differenza tra due date

Gli argomenti di questa pagina

  • Differenza in giorni tra due date
  • Calcolo degli anni tra una data e quella corrente
  • Calcolare gi anni con una funzione personale
  • Calcolo degli anni tra due date
  • La differenza in anni, mesi, giorni tra due date

Queste sono alcune date su cui faremo dei calcoli in questa pagina
04/07/2007
07/01/2008
18/08/2009
09/07/1997
04/07/2002
29/07/2004
24/06/2002
07/09/2007
12/07/2005
27/06/1992
28/06/2007
12/01/1947

Useremo queste date per testare alcune funzioni per eseguire calcoli su differenza di date. Penso che per questo tipo di lavoro sia più indicato l'uso di funzioni che semplificano e rendono gli script più trasportabili.

Avvertenza: in alcune funzioni che presento qui sotto nell'elenco dei parametri è indicata una sola data. Questo perchè viene calcolata la differenza tra quella data e la data corrente che viene elaborata nella funzione stessa.
Se si desidera mandare alla funzione due date anzichè una per calcolare la differenza tra due date determinate dall'utente è possibile, con piccole modifiche, trasformare la funzione in modo che accetti due parametri ($start, $end) anzichè un solo parametro.
Faccio un esempio.
Nella funzione personale mostrata a sinistra viene eseguito il calcolo tra la data mandata come argomento della funzione e la data corrente.
Nella funzione personale mostrata a destra il calcolo viene eseguito tra due date mandate come argomento.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function getAge_a ($data){
    list(
$day$month$year) = preg_split('/[-\.\/: ]/'$data);
    
$year_diff date("Y") - $year
    
$month_diff date("m") - $month
    
$day_diff date("d") - $day
    if (
$day_diff || $month_diff 0) {
        
$year_diff--; 
    }
    return 
$year_diff
}

for(
$i=0;$i<count($nascite);$i++) {
    
$nascita $nascite[$i];
    echo 
"Per la data " $nascita " trascorsi ";
    echo 
getAge_a($nascita) . " anni<br />\n";
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function getAge_b ($start$end){
    list(
$start_day$start_month$start_year) = preg_split('/[-\.\/: ]/'$start);
    list(
$end_day$end_month$end_year) = preg_split('/[-\.\/: ]/'$end);
    
$year_diff $end_year $start_year
    
$month_diff =$end_month $start_month
    
$day_diff $end_day $start_day
    if (
$day_diff || $month_diff 0) {
        
$year_diff--; 
    }
    return 
$year_diff
}
$data_end date("d/m/Y");        //    o quel che si desidera
for($i=0;$i<count($nascite);$i++) {
    
$data_start $nascite[$i];
    echo 
"Per la data " $nascita " trascorsi ";
    echo 
getAge_b($data_start$data_end) . " anni<br />\n";
}
?>

Come è visibile nei due risultati che si vedono qui sotto otteniamo gli stessi dati perchè nella funzione utente modificata, come secondo argomento ho usato la data corrente che nella prima funzione veniva calcolata in automatico.

Per la data 04/07/2007 trascorsi 15 anni
Per la data 07/01/2008 trascorsi 13 anni
Per la data 18/08/2009 trascorsi 12 anni
Per la data 09/07/1997 trascorsi 24 anni
Per la data 04/07/2002 trascorsi 20 anni
Per la data 29/07/2004 trascorsi 17 anni
Per la data 24/06/2002 trascorsi 19 anni
Per la data 07/09/2007 trascorsi 14 anni
Per la data 12/07/2005 trascorsi 16 anni
Per la data 27/06/1992 trascorsi 29 anni
Per la data 28/06/2007 trascorsi 14 anni
Per la data 12/01/1947 trascorsi 74 anni
  Per la data 12/01/1947 trascorsi 15 anni
Per la data 12/01/1947 trascorsi 13 anni
Per la data 12/01/1947 trascorsi 12 anni
Per la data 12/01/1947 trascorsi 24 anni
Per la data 12/01/1947 trascorsi 20 anni
Per la data 12/01/1947 trascorsi 17 anni
Per la data 12/01/1947 trascorsi 19 anni
Per la data 12/01/1947 trascorsi 14 anni
Per la data 12/01/1947 trascorsi 16 anni
Per la data 12/01/1947 trascorsi 29 anni
Per la data 12/01/1947 trascorsi 14 anni
Per la data 12/01/1947 trascorsi 74 anni

Dopo questa premessa possiamo passare ad esaminare alcune funzioni che ci restituiscono il numero dei giorni e/o dei mesi tra due date.

Differenza in giorni tra due date

Esempio 1: La funzione utente datediff() compie questo lavoro:
divide le date mandate come argomenti nelle sue parti più semplici usando la funzione PHP preg_split() e la regex che contiene tutti i caratteri che più comunemente vengono usati come separatori tra le parti che compongono la data
quindi viene elaborata la differenza usando la funzione PHP mktime() per lavorare coi timestamp delle date.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function datediff($partenza$fine) {
    
$arr_partenza preg_split('/[-\.\/: ]/'$partenza);
    
$partenza_gg $arr_partenza[0];
    
$partenza_mm $arr_partenza[1];
    
$partenza_aa $arr_partenza[2];
    
$arr_fine preg_split('/[-\.\/: ]/'$fine);
    
$fine_gg $arr_fine[0];
    
$fine_mm $arr_fine[1];
    
$fine_aa $arr_fine[2];
    
$date_diff mktime(1200$fine_mm$fine_gg$fine_aa) - mktime(1200$partenza_mm$partenza_gg$partenza_aa);
    
$date_diff  floor(($date_diff 60 60 24));
    return 
$date_diff;
}
//    =========================================================
$cur_data date("d/m/Y");
for(
$i=0;$i<count($nascite);$i++) {
    
$nascita $nascite[$i];
    echo 
"Tra la data " $nascita " e la data " $cur_data " sono trascorsi ";
    echo 
datediff($nascita$cur_data) . " giorni<br />\n";
}
?>

Tra la data 04/07/2007 e la data 04/07/2022 sono trascorsi 5479 giorni
Tra la data 07/01/2008 e la data 04/07/2022 sono trascorsi 5291 giorni
Tra la data 18/08/2009 e la data 04/07/2022 sono trascorsi 4703 giorni
Tra la data 09/07/1997 e la data 04/07/2022 sono trascorsi 9126 giorni
Tra la data 04/07/2002 e la data 04/07/2022 sono trascorsi 7305 giorni
Tra la data 29/07/2004 e la data 04/07/2022 sono trascorsi 6549 giorni
Tra la data 24/06/2002 e la data 04/07/2022 sono trascorsi 7315 giorni
Tra la data 07/09/2007 e la data 04/07/2022 sono trascorsi 5414 giorni
Tra la data 12/07/2005 e la data 04/07/2022 sono trascorsi 6201 giorni
Tra la data 27/06/1992 e la data 04/07/2022 sono trascorsi 10964 giorni
Tra la data 28/06/2007 e la data 04/07/2022 sono trascorsi 5485 giorni
Tra la data 12/01/1947 e la data 04/07/2022 sono trascorsi 27566 giorni

Calcolo degli anni tra una data e quella corrente

Esempio 2: La funzione utente getAge()
La funzione confronta la data mandata come argomento con la data corrente.
Una volta esplosa la data mandata come argomento esegue delle differenze tra le parti della data corrente e la parti della data in esame.
Se la differenza dei giorni o quella dei mesi è minore di 0 (zero) viene usato un correttivo sulla differenza degli anni decrementandola di una unità.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function getAge ($data){
    
// Ricavo giorno, mese e anno
    
list($day$month$year) = preg_split('/[-\.\/: ]/'$data);
    
$year_diff date("Y") - $year
    
$month_diff date("m") - $month
    
$day_diff date("d") - $day
    if (
$day_diff || $month_diff 0) {
        
$year_diff--; 
    }
    return 
$year_diff
}
//    =========================================================
for($i=0;$i<count($nascite);$i++) {
    
$nascita $nascite[$i];
    echo 
"Per la data " $nascita " trascorsi ";
    echo 
getAge($nascita) . " anni<br />\n";
}
?>

Per la data 04/07/2007 trascorsi 15 anni
Per la data 07/01/2008 trascorsi 13 anni
Per la data 18/08/2009 trascorsi 12 anni
Per la data 09/07/1997 trascorsi 24 anni
Per la data 04/07/2002 trascorsi 20 anni
Per la data 29/07/2004 trascorsi 17 anni
Per la data 24/06/2002 trascorsi 19 anni
Per la data 07/09/2007 trascorsi 14 anni
Per la data 12/07/2005 trascorsi 16 anni
Per la data 27/06/1992 trascorsi 29 anni
Per la data 28/06/2007 trascorsi 14 anni
Per la data 12/01/1947 trascorsi 74 anni

Calcolare gi anni con una funzione personale

Esempio 3: La funzione utente calcola_anni()
Anche in questo caso la funzione confronta la data mandata come argomento con la data corrente e anche in questo caso, dopo aver esplosa la data mandata come argomento, viene eseguita la differenza tra l'anno corrente e quello della data mandata come argomento.
Quindi la dovuta correzione nel caso che il mese corrente sia inferiore al mese della data o che il giorno corrente sia inferiore al giorno della data mandata come argomento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function calcola_anni($data) {
    list(
$giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data);
    
$eta date('Y') - $anno;
    if (
date('m') <$mese) {
        
$eta--;
    } elseif (
date('d') <$giorno) {
        
$eta--;
    }
    return 
$eta;
}
//    =========================================================
for($i=0;$i<count($nascite);$i++) {
    
$nascita $nascite[$i];
    echo 
"Anni trascorsi per la data " $nascita ": ";
    echo 
calcola_anni($nascita) . "<br />\n";
}
?>

Anni trascorsi per la data 04/07/2007: 15
Anni trascorsi per la data 07/01/2008: 13
Anni trascorsi per la data 18/08/2009: 12
Anni trascorsi per la data 09/07/1997: 24
Anni trascorsi per la data 04/07/2002: 20
Anni trascorsi per la data 29/07/2004: 17
Anni trascorsi per la data 24/06/2002: 19
Anni trascorsi per la data 07/09/2007: 14
Anni trascorsi per la data 12/07/2005: 16
Anni trascorsi per la data 27/06/1992: 29
Anni trascorsi per la data 28/06/2007: 14
Anni trascorsi per la data 12/01/1947: 74

Calcolo degli anni tra due date

Esempio 4: La funzione utente getYear()
La funzione è simile alle precedenti ma richiede come argomenti la data di partenza e la data finale. E' ininfluente se per questo esempio come data finale ho usato la data corrente.
Dopo aver esploso le due date nei loro componenti più elementari, calcolo la differenza tra i due anni.
Questa differenza viene corretta con un decremento di una unità se il mese finale è minore del mese iniziale o se il giorno finale è minore di quello iniziale.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function getYear ($start$end) {
    list(
$start_d$start_m$start_y) = preg_split('/[-\.\/: ]/'$start);
    list(
$end_d$end_m$end_y) = preg_split('/[-\.\/: ]/'$end);
    
$year_dif $end_y $start_y;
    if (
$end_m $start_m) {
        
$year_dif--;
    } elseif (
$end_d $start_d) {
        
$year_dif--;
    }
    return 
$year_dif;
}
//    =========================================================
$cur_data date("d/m/Y");
for(
$i=0;$i<count($nascite);$i++) {
    
$nascita $nascite[$i];
    echo 
"Tra " $nascita " e " $cur_data " sono trascorsi ";
    echo 
getYear($nascita$cur_data) . " anni<br />\n";
}
?>

Tra 04/07/2007 e 04/07/2022 sono trascorsi 15 anni
Tra 07/01/2008 e 04/07/2022 sono trascorsi 13 anni
Tra 18/08/2009 e 04/07/2022 sono trascorsi 12 anni
Tra 09/07/1997 e 04/07/2022 sono trascorsi 24 anni
Tra 04/07/2002 e 04/07/2022 sono trascorsi 20 anni
Tra 29/07/2004 e 04/07/2022 sono trascorsi 17 anni
Tra 24/06/2002 e 04/07/2022 sono trascorsi 19 anni
Tra 07/09/2007 e 04/07/2022 sono trascorsi 14 anni
Tra 12/07/2005 e 04/07/2022 sono trascorsi 16 anni
Tra 27/06/1992 e 04/07/2022 sono trascorsi 29 anni
Tra 28/06/2007 e 04/07/2022 sono trascorsi 14 anni
Tra 12/01/1947 e 04/07/2022 sono trascorsi 74 anni

La differenza in anni, mesi, giorni tra due date

Esempio 5: La funzione utente diff_date()
Cominciamo a voler ottenere qualcosa di più dai nostri calcoli sulle date. Con questa funzione, che prende per argomenti due date differenti, otteniamo il numero degli anni, dei mesi e dei giorni. Ma anche il nostro codice comincia ad essere più complesso. Per questo motivo alcune delle istruzioni principali mostrano già dei commenti.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
function diff_date($start$end) {
    list(
$start_day$start_mon$start_year) = preg_split('/[-\.\/: ]/'$start);
    list(
$current_day$current_mon$current_yr) = preg_split('/[-\.\/: ]/'$end);
    
//    vengono rilevati i giorni del mese di partenza
    
$start_mon_max  date ("t",mktime (0,0,0,$start_mon,$start_day,$start_year));
    
$start_day_diff   $start_mon_max $start_day;
    
$start_mon_diff   12 $start_mon 1;
    
$start_day  1;
    
$start_mon  1;
    
$start_yr  $start_year 1;
    
$day_diff = ($current_day $start_day) + 1;    //    aggiunge un giorno al calcolo
    
$mon_diff = ($current_mon $start_mon) + 1;    //    aggiunge un mese al calcolo
    
$yr_diff = ($current_yr $start_yr);            //    calcola la differenza degli anni
    
$day_diff $day_diff $start_day_diff;
    
$mon_diff $mon_diff $start_mon_diff;
    
//    i correttivi per i giorni e per i mesi
    
if ($day_diff >= $start_mon_max) {
        
$day_diff $day_diff $start_mon_max;
        
$mon_diff $mon_diff 1;
    }
    
//    altri correttivi per i giorni e per i mesi
    
if ($mon_diff >= 12) {
        
$mon_diff $mon_diff 12;
        
$yr_diff $yr_diff 1;
    }
    
$years "anni";
    
$days "giorni";
    if (
$yr_diff == "1"$years "anno";
    if (
$day_diff == "1"$days "giorno";
    
$result_ret = array($yr_diff " " $years$mon_diff " mesi"$day_diff " " $days);
    return 
$result_ret;
}
//    =========================================================
$cur_data date("d/m/Y");
for(
$i=0;$i<count($nascite);$i++) {
    
$nascita $nascite[$i];
    
$result diff_date($nascita$cur_data);
    echo 
"La differenza tra <b>".$nascita."</b> e <b>".$cur_data."</b> è di: ";
    echo 
implode (", "$result) . "<br />\n";
}
?>

La differenza tra 04/07/2007 e 04/07/2022 è di: 15 anni, 0 mesi, 0 giorni
La differenza tra 07/01/2008 e 04/07/2022 è di: 14 anni, 5 mesi, 28 giorni
La differenza tra 18/08/2009 e 04/07/2022 è di: 12 anni, 10 mesi, 17 giorni
La differenza tra 09/07/1997 e 04/07/2022 è di: 24 anni, 11 mesi, 26 giorni
La differenza tra 04/07/2002 e 04/07/2022 è di: 20 anni, 0 mesi, 0 giorni
La differenza tra 29/07/2004 e 04/07/2022 è di: 17 anni, 11 mesi, 6 giorni
La differenza tra 24/06/2002 e 04/07/2022 è di: 20 anni, 0 mesi, 10 giorni
La differenza tra 07/09/2007 e 04/07/2022 è di: 14 anni, 9 mesi, 27 giorni
La differenza tra 12/07/2005 e 04/07/2022 è di: 16 anni, 11 mesi, 23 giorni
La differenza tra 27/06/1992 e 04/07/2022 è di: 30 anni, 0 mesi, 7 giorni
La differenza tra 28/06/2007 e 04/07/2022 è di: 15 anni, 0 mesi, 6 giorni
La differenza tra 12/01/1947 e 04/07/2022 è di: 75 anni, 5 mesi, 23 giorni

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum