Christophe Le Bot

Pratique de la conception numérique

Formatage d’une durée avec PHP

PHP regorge de fonctions et de variables pour gérer le temps. Pourtant, quand on souhaite afficher une durée entre deux dates, il n’y a aucune fonction spécifique ! Voici comment s’en sortir.

Un peu de mathématiques

Le principe est d’utiliser un nombre entier, par exemple une durée exprimée en secondes. A vous de convertir la durée avec vos scripts PHP (la fonction mktime() est toute désignée).

Ensuite, quelques formules mathématiques simples donnent un tableau contenant toutes les valeurs de la durée dans les unités de temps que vous souhaitez utiliser :

$duration = 3695;

// Initialisation
$duration = abs($duration);
$converted_duration = array();

// Conversion en semaines
$converted_duration['weeks']['abs'] = floor($duration / (60*60*24*7));
$modulus = $duration % (60*60*24*7);

// Conversion en jours
$converted_duration['days']['abs'] = floor($duration / (60*60*24));
$converted_duration['days']['rel'] = floor($modulus / (60*60*24));
$modulus = $modulus % (60*60*24);

// Conversion en heures
$converted_duration['hours']['abs'] = floor($duration / (60*60));
$converted_duration['hours']['rel'] = floor($modulus / (60*60));
$modulus = $modulus % (60*60);

// Conversion en minutes
$converted_duration['minutes']['abs'] = floor($duration / 60);
$converted_duration['minutes']['rel'] = floor($modulus / 60);
$modulus = $modulus % 60;

// Conversion en secondes
$converted_duration['seconds']['abs'] = $duration;
$converted_duration['seconds']['rel'] = $modulus;

// Affichage
print_r( $converted_duration);

Ce code affichera le résultat suivant :

Array
   (
      [weeks] => Array
         (
            [abs] => 0
         )

      [days] => Array
         (
            [abs] => 0
            [rel] => 0
         )

      [hours] => Array
        (
            [abs] => 1
            [rel] => 1
         )

      [minutes] => Array
         (
            [abs] => 61
            [rel] => 1
         )

      [seconds] => Array
         (
            [abs] => 3695
            [rel] => 35
         )
   )

Vous obtenez un tableau avec le nombre de semaines, de jours, d’heures, de minutes et de secondes que vous pouvez ensuite utiliser pour l’affichage. Pour chaque unité de temps, la cellule [abs] du tableau stocke la durée totale, alors que la cellule [rel] stocke la durée restante (définie par le modulo).

Prendre la valeur absolue de la durée est capitale ! En effet, sans abs(), la fonction floor() donnera des résultats faux avec un durée négative. C’est logique puisqu’elle retourne toujours l’entier inférieur d’un nombre réel. Si la durée vaut +4.4, vous obtenez +4. Si la durée vaut -4.4, vous obtenez -5 !

Et si j’utilise une base de données ?

Si vos dates à comparer viennent d’une base de données, la conversion en timestamp peut se faire directement dans la requête SQL. Avec MySQL, les champs de type DATE, DATETIME ou TIME sont convertis par la fonction UNIX_TIMESTAMP(). Au passage, attention à la limite des champs TIME (de ‘-838:59:59’ à ‘838:59:59’) !

Si vous utilisez MySQL 5, la fonction TIMESTAMPDIFF() fera tout à votre place… sauf le formatage en PHP que je vous propose !

En guise de conclusion, consultez les pages PHP et MySQL concernant les fonctions de dates et d’heures qui vous épargneront des calculs inutiles :

1 commentaire

Auteur
zian
Date de publication
25 février 2007 à 13h19

Merci pour ce code très utile 😉


* Informations obligatoires