PHP : Affichage d’un DateInterval user-friendly
Sommaire
Voici une fonction pour afficher en PHP un DateInterval user-friendly.
Exemples : 1 heure ; 3 jours, 2 heures, 1 minute ; etc.
L’objet DateInterval
Pour rappel, un objet DateInterval s’obtient en calculant la différence entre deux objet DateTime avec DateTime::diff.
Exemple :
$mars = new DateTime('2017-03-01 00:00:00');
$avril = new DateTime('2017-04-01 00:00:00');
$diff = $mars->diff($avril);
echo "<pre>";
print_r($diff);
echo "</pre>";
Résultat :
DateInterval Object
(
[y] => 0
[m] => 1
[d] => 3
[h] => 0
[i] => 0
[s] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 31
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
Le but est d’utiliser la méthode format() de l’objet DateInterval pour n’afficher que les paramètres nécessaires.
L’affichage user-friendly
La fonction
**
* Affiche un DateInterval lisible par les humains
*
* @param DateInterval $date_interval
* Intervalle à afficher
* @return String
* Intervalle lisible par les humains
*/
function interval_to_string($date_interval)
{
$parametres = array(
array("y", 'année', 'années'),
array("m", 'mois', 'mois'),
array("d", 'jour', 'jours'),
array("h", 'heure', 'heures'),
array("i", 'minute', 'minutes'),
array("s", 'seconde', 'secondes'),
);
$resultat = array();
foreach ($parametres as $parametre)
{
$format = $parametre[0];
$singulier = $parametre[1];
$pluriel = $parametre[2];
if ($date_interval->format('%'.$format) > 0)
{
$resultat[] = $date_interval->format('%'.$format)." ".($date_interval->format('%'.$format) > 1 ? $pluriel : $singulier);
}
}
return implode(', ', $resultat);
}
Quelques tests
$a = new DateTime('2017-01-01 00:00:00');
$b = new DateTime('2017-01-02 00:02:37');
$diff = $a->diff($b);
echo interval_to_string($diff);
1 jour, 2 minutes, 37 secondes
$a = new DateTime('2017-01-01 00:00:00');
$b = new DateTime('2017-01-01 00:00:37');
$diff = $a->diff($b);
echo interval_to_string($diff);
37 secondes
$a = new DateTime('2017-01-01 00:00:37');
$b = new DateTime('2023-05-28 23:34:58');
$diff = $a->diff($b);
echo interval_to_string($diff);
6 années, 4 mois, 26 jours, 23 heures, 34 minutes, 21 secondes