AntoineViau.com

Parce que les transatlantiques...

Durée"humaine" entre deux dates
Code - PHP

Le code ci-dessous est une fonction PHP qui a pour rôle de donner le temps écoulé entre deux dates. Le tableau retourné est composé de 6 champs : years, months, days, hours, minutes, seconds. Ce genre de fonction vous permettra d'afficher des textes du genre : "ceci s'est produit il y a 1 an, 3 mois, 12 jours, 4 heures et 5 minutes, 10 secondes".
Attention, le format d'entrée ($from et $to) est une chaîne de caractères du type YYYY-MM-DD HH:II:SS (format DateTime MYSQL).

function DateDiff($from,$to)
{
// $from has to be before $to
if ( $from > $to )
{
$tmp = $from;
$from = $to;
$to = $tmp;
}
sscanf($from,'%04d-%02d-%02d %02d:%02d:%02d',$f['year'],$f['month'],$f['day'],$f['hour'],$f['minute'],$f['second']);
sscanf($to ,'%04d-%02d-%02d %02d:%02d:%02d',$t['year'],$t['month'],$t['day'],$t['hour'],$t['minute'],$t['second']);
$f['ts'] = gmmktime($f['hour'],$f['minute'],$f['second'],$f['month'],$f['day'],$f['year']);
$t['ts'] = gmmktime($t['hour'],$t['minute'],$t['second'],$t['month'],$t['day'],$t['year']);

$res['seconds'] = 0;
$res['minutes'] = 0;
$res['hours'] = 0;
$res['years'] = 0;
$res['months'] = 0;
$res['days'] = 0;

$diff = $t['ts'] - $f['ts'];
if ( $diff < 60 )
{
$res['seconds'] = $diff;
return($res);
}
if ( $diff < 60*60 )
{
$res['minutes'] = floor($diff/60);
$res['seconds'] = $diff % 60;
return($res);
}
if ( $diff < 60*60*24 )
{
$res['hours'] = floor($diff/(60*60));
$diff -= $res['hours']*60*60;
$res['minutes'] = floor($diff/60);
$res['seconds'] = $diff % 60;
return($res);
}

$res['seconds'] += 60 - $f['second'];
$res['seconds'] += $t['second'] ;
if ( $res['seconds'] >= 60 )
{
$res['minutes']++;
$res['seconds'] -= 60;
}
$res['minutes'] += 60 - $f['minute'];
$res['minutes'] += $t['minute'] - 1;
if ( $res['minutes'] >= 60 )
{
$res['hours']++;
$res['minutes'] -= 60;
}
$res['hours'] += 24 - $f['hour'];
$res['hours'] += $t['hour'] -1;
if ( $res['hours'] >= 24 )
{
$res['days']++;
$res['hours'] -= 24;
}

$nj = (date('t',mktime(0,0,0,$f['month'],1,$f['year'])));
$res['days'] += $nj - $f['day'] + $t['day']-1;
if ( $res['days'] >= $nj )
{
$res['days'] -= $nj;
$res['months']++;
}
if ( $f['year'] != $t['year'] )
{
$res['months'] += 12-$f['month'];
$res['months'] += $t['month']- 1;
}
else
{
$res['months'] += $t['month'] - $f['month'] - 1;
}
if ( $res['months'] > 12 )
{
$res['months'] -= 12;
$res['years']++;
}
$res['years'] += $t['year'] - $f['year'] -1;
if ( $res['years'] < 0 )
{
$res['years'] = 0;
}
return($res);
}