Bonjour,

Je souhaiterai obtenir les dates de la manière suivante
"Il y a x jours, x mois, x années"
Plutot que "le 08.01.2015 à xxhxx".

J'ai obtenu le code suivant mais je peine à obtenir le résultat.
Je crois savoir qu'il faut appeler le timestamp (echo time(); ???) puis la fonction, mais je ne sais pas trop comment m'y prendre.

Merci d'avance =)

                <?php

function time_elapsed_string($ptime)
{
    $etime = time() - $ptime;

    if ($etime < 1)
    {
        return '0 seconds';
    }

    $a = array( 365 * 24 * 60 * 60  =>  'year',
                 30 * 24 * 60 * 60  =>  'month',
                      24 * 60 * 60  =>  'day',
                           60 * 60  =>  'hour',
                                60  =>  'minute',
                                 1  =>  'second'
                );
    $a_plural = array( 'year'   => 'years',
                       'month'  => 'months',
                       'day'    => 'days',
                       'hour'   => 'hours',
                       'minute' => 'minutes',
                       'second' => 'seconds'
                );

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1)
        {
            $r = round($d);
            return $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' ago';
        }
    }
}
                    ?>

13 réponses


ToToSe
Réponse acceptée

Yop, voila voila ! :)

$time = strtotime('2014-11-12 17:25:43'); //DATETIME de l'evenement

echo 'Il y a '.humanTiming($time);

function humanTiming ($time)
{
    $time = time() - $time;
    $tokens = array (
        31536000 => 'an',
        2592000 => 'mois',
        604800 => 'semaine',
        86400 => 'jour',
        3600 => 'heure',
        60 => 'minute',
        1 => 'seconde'
    );

    foreach ($tokens as $unit => $text) {
        if ($time < $unit) continue;
        $numberOfUnits = floor($time / $unit);
        return $numberOfUnits.' '.$text.(($numberOfUnits>1 AND $text != 'mois')?'s':'');
    }

}

Merci pour ta réponse =)
Je vois que tu fixes la date ?
Dans mon contexte, c'est un livre d'or mis en place et dans les commentaires je souhaite que la date relative apparaisse.
Je n'ai pas la date fixée puisque le visiteur peut publier quelques soit le moment.
En réfléchissant, je ne devrai pas inclure une datetime dans ma table ?

Moi ma technique c'est
un unix_time dans ma table. Je convertis en hh:mm:ss dd/mm/yyyy. Et ensuite dans mon affichage j'ai quelque chose similaire à

<span id="time_ago_[unique]">22h10:40 le 08/01/2015</span>

Et mon JS va convertir en "il y a 2 minutes"

Re!
Ah mais la date que j'ai mit dans mon script, c'est juste pour l'exemple :p
Ce que tu devra faire c'est dans un premier temps enregistrer le datetime lors de l'enregistrement d'un commentaire
et dans un second temps lors de l'affichage des commentaire mettre le datetime du commentaire a la place de la variable $time appeler ici :

echo 'Il y a '.humanTiming($time);

Je ne connaissais pas cette technique.
J'utilise à priori le php, mais je ne suis pas très à l'aise avec les fonctions et date.
Ta technique est, on dirait, plus facile. Reste plus qu'à apprendre le javascript ^^

Tu as des librairies faites dispo sur github, qui sont facilement trouvable via "time ago" en recherche ;)
faut pas non plus essayer de réinventer la roue quand elle existe :)

Tu as des librairies faites dispo sur github, qui sont facilement trouvable via "time ago" en recherche ;)
faut pas non plus essayer de réinventer la roue quand elle existe :)

Sauf qu'il n'y a pas non plus que le javascript, surtout que ton exemple ne fonctionnera pas pour lui dans le cas présent, vu que ton sélecteur est défini sur une valeur unique de l'attribut id d'une balise.

J'ai quelques clées en mains.
Je vais me creuser les méninges maintenant.
Je reviendrai vers vous si je coince là dessus.
Merci à tous :)

Lartak : L'id unique, soit tu le prends depuis ta table, soit tu l'incrémentes dans ta boucle :)

<?php
$now = new Datetime(); // On crée une variable contenant la date d'aujourd'hui
$date =  new Datetime('2014-11-12 17:25:43'); // Une autre avec la date voulu
$difference = $now->diff($date); // On calcule la différence entre les deux dates
echo 'Il y a ' . $difference->d. ' jours' . $difference->m . ' mois, ' . $difference->y. ' années';

Je ne me souviens plus exactement des index du l'array généré par la méthode diff par contre.
Après ce n'est qu'une piste...
Plus d'info:
http://php.net/manual/fr/datetime.diff.php

La méthode de Spiker pour gerer les dates est, pour moi, l'une des meilleures. time() et date() sont plus compliqué à utiliser que l'objet Datetime(). Objet qui contient plein de méthode très utiles :)

Mais si je me souviens bien, et il c'est ce que dit la doc, la valeur de retour de Datetime()->diff($date); est en jours. Si je cite :

If the DateInterval object was created by DateTime::diff(), then this is the total number of days between the start and end dates. Otherwise, days will be FALSE.

Après il suffit d'utilisé la méthode de ToToSe (du moins la partie pour traduire le nombre de jour en jours, mois, années) et tu aura ta réponse.

D'ailleurs merci de ta réponse elhebertn enfaite ça ne renvois pas un tableau mais un objet qui contient bien le nombre exact de jours, mois, années, secondes, minutes, heures... j'ai édité mon précédent message !

@Spiker Pas de soucis. Et moi, faut vraiment que j'aille dormir un jour, car je commence à ne plus savoir lire une doc' correctement xD