Bonjour à tous,

Je me suis amusé à créer une petite fonction pour gérer l'affichage des dates, comme on peut le voir sur le forum : il y a 5 minutes, il y a 1 semaine et 3 jours, etc.

Je vous livre ici mon code (ne faites pas attention à la classe, c'est un helper pour cakephp, regardez juste la fonction 'format') et dites moi ce que vous en pensez et si vous pensez qu'on peut le faire plus court et mieux.

<?php
    class DateHelper extends Helper {
        function format($datetime) {
            $now = time();
            $created = strtotime($datetime);
            // La différence est en seconde
            $diff = $now-$created;
            $m = ($diff)/(60); // on obtient des minutes
            $h = ($diff)/(60*60); // ici des heures
            $j = ($diff)/(60*60*24); // jours
            $s = ($diff)/(60*60*24*7); // et semaines
            if ($diff < 60) { // "il y a x secondes"
                return 'Il y a '.$diff.' secondes';
            }
            elseif ($m < 60) { // "il y a x minutes"
                $minute = (floor($m) == 1) ? 'minute' : 'minutes';
                return 'Il y a '.floor($m).' '.$minute;
            }
            elseif ($h < 24) { // " il y a x heures, x minutes"
                $heure = (floor($h) <= 1) ? 'heure' : 'heures';
                $dateFormated = 'Il y a '.floor($h).' '.$heure;
                if (floor($m-(floor($h))*60) != 0) {
                    $minute = (floor($m) == 1) ? 'minute' : 'minutes';
                    $dateFormated .= ', '.floor($m-(floor($h))*60).' '.$minute;
                }
                return $dateFormated;
            }
            elseif ($j < 7) { // " il y a x jours, x heures"
                $jour = (floor($j) <= 1) ? 'jour' : 'jours';
                $dateFormated = 'Il y a '.floor($j).' '.$jour;
                if (floor($h-(floor($j))*24) != 0) {
                    $heure = (floor($h) <= 1) ? 'heure' : 'heures';
                    $dateFormated .= ', '.floor($h-(floor($j))*24).' '.$heure;
                }
                return $dateFormated;
            }
            elseif ($s < 5) { // " il y a x semaines, x jours"
                $semaine = (floor($s) <= 1) ? 'semaine' : 'semaines';
                $dateFormated = 'Il y a '.floor($s).' '.$semaine;
                if (floor($j-(floor($s))*7) != 0) {
                    $jour = (floor($j) <= 1) ? 'jour' : 'jours';
                    $dateFormated .= ', '.floor($j-(floor($s))*7).' '.$jour;
                }
                return $dateFormated;
            }
            else { // on affiche la date normalement
                return strftime("%d %B %Y à %H:%M", $created);
            }
        }
    }

1 réponse


JeremyB
Auteur

Je n'avais pas vu cette fonction, je te remercie. Elle gère plus de cas que la mienne mais étant donné que je ne veux pas 36 cas et seulement une façon, je préfère la mienne. Sur tout que pour l'affichage, avec la fonction ci-dessus, ça donne :

<?php
// Si $timestamp est il y a 1 month, 1 week, 5 days et 6 hours
echo CakeTime::timeAgoInWords($timestamp, array(
    'accuracy' => array('month' => 'month'),
    'end' => '1 year'
));
// Sort '1 month ago'

Alors qu'avec la mienne :

<?php
echo $this->Date->format($datetime);
//ou pour ceux qui n'ont pas cakephp mais juste la fonction
echo format($datetime);
?>

Merci quand même pour ta réponse, ça peut en aider d'autres. ;)