PHP : Affichage d’un DateInterval user-friendly

Voici une fonction pour afficher en PHP un DateInterval user-friendly.

Exemples : 1 heure ; 3 jours, 2 heures, 1 minutes ; 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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Êtes-vous humain ? *