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