samedi 12 Juil 2008

Âge d'un article en PHP

PHPJe suis tombé il y a quelques jours sur cet article via Blogasty Afficher l'âge d'un article. Un billet qui obtient 355 points à ce jour, c'est à dire plus que je n'ai jamais eu!

Le fait que l'auteur soit le créateur de Blogasty doit jouer, puisque Bleebot le confesse lui-même, ce n'est pas un spécialiste des dates en PHP. En effet! ;-)

Voyons si ma fonction mieux aura plus de points. :mrgreen:

~

Déjà quelques commentaires sur la fonction proposée. Bleebot en écrit beaucoup pour refaire des fonctions existantes. ;-)

$date2 = mktime(date("H"), date("i"), date("s"), date("m"),date("d"),date("Y"));

donc $date2 est l'heure actuelle, c'est à dire la fonction time() tout simplement!

list($year, $month, $day_time) = explode('-', $mysqlDate);
list($day, $time) = explode(" ", $day_time);
list($hour, $minute, $second) = explode(":", $time);
$date1 = mktime($hour, $minute, $second, $month, $day, $year);

Tout ça pour convertir la date en timestamp. Ce qui est le rôle de la fonction strtotime. Un équivalent est donc $date1 = strtotime ($mysqlDate).

$timedifference=$date2-$date1;
$corr=date("I",$date2)-date("I",$date1);
$timedifference+=$corr;

C'est inutile de tenir compte de l'heure d'été ou d'hiver, puisqu'on est déjà en timestamp donc un temps en secondes de le 1er janvier 1970. mktime aura déjà tenu compte de l'heure d'été ou d'hiver pour calculer ce nombre de secondes!

$period = $timedifference;
$messtime = "";

2 lignes inutiles! Pourquoi passer de $timedifference à $period?
Pourquoi mettre du vide dans $messtime, il est toujours initialisé dans la suite? Et guillemets simples quand on n'utilise pas de variables dans les chaines!

Ensuite Bleebot tiens compte du fait qu'on est 1 ou plusieurs jours/heures/minutes pour mettre un s ou non. C'est très bien, mais quand on veut modifier le texte (par exemple pour le mettre en français), ça fait 6 endroits à modifier. Du coup pourquoi prendre de la mémoire pour le stocker dans une variable au lieu de l'écrire directement?

~

C'est à se demander comment ce type peut pondre des sites aussi bien avec un niveau pareil en PHP. :mrgreen: J'espère qu'il le prendra bien, mon but est juste d'en faire apprendre un peu plus sur la gestion des dates aux lecteurs. :-)


Voilà ce que je vous propose:

<?php

function dateDiff ($date)
{
  $secondes = time() - strtotime ($date); /* La différence de temps en secondes. */

  /* On cherche d'abord l'unité de temps: */
  if (($durée = floor ($secondes /3600/24)) > 0)
    $unité = 'jour';
  elseif (($durée = floor ($secondes /3600)) > 0)
    $unité = 'heure';
  else
  {
    $durée = floor ($secondes /60);
    $unité = 'minute';
  }

  /* Ensuite $pluriel = 's' si $durée >1, du vide sinon: */
  $pluriel = ($durée > 1)? 's': '';

  echo "Il y a $durée $unité$pluriel.";
}

/* Appel de la fonction: */
dateDiff ('2008-07-12 19:35:06');

?>

~

À retenir: mktime est inutile ici, elle ne sert généralement que lorsqu'on a des morceaux de date. Sinon strtotime est une fonction très puissante qui reconnait les dates écrites sous différents formats, même en langage courant, malheureusement en anglais: '2008-07-12', 'now', '12 July 2008', '+3 week 2 days 4 hours', 'next Thursday', 'last Monday'.

Pour optimiser votre code, ne stocker en variables que ce qu'il est nécessaire de stocker. Notez que si vous souhaitez juste changer de nom, la syntaxe =& permet de créer un alias d'une variable. Par exemple pour raccourcir $_SESSION en $s:

$s =& $_SESSION;

En modifiant $s, cela modifie $_SESSION, ce n'est pas une copie, mais une sorte de pointeur.

Si vous avez des questions ou remarques, n'hésitez pas, je répond toujours aux commentaires. :-)


café Cet article vous a aidé? 
Offrez-moi un café!
Agrégateur informatique

4 réponses à “Âge d'un article en PHP”

  1. 1
    geekbay (geekbay.fr) a dit:

    Pas mal moi je fais plus court mais sans gestion du pluriel

    function ago($time) {
    $t = time() - strtotime($time);
    if($t < 60) return ''.$t.' secondes ago';
    if($t/60 < 60) return ''.floor($t/60).' minutes ago';
    if($t/3600 24) return ''.date('j F H\hi',strtotime($time));
    }

    meme si c'est pas exactement pareil sur la fin le principe est la.

  2. 2
    David (azur-dev.kizone.net) a dit:

    J'avais commencé selon le même principe ($t < 60...), mais il est embêtant ce pluriel! C'est lui qui oblige à stocker la durée pour comparer ensuite.

  3. 3
    Christophe Lefevre (bleebot.com) a dit:

    Mais, mais, mais,... On se moque de moi par ici ! ;)

  4. 4
    David (azur-dev.kizone.net) a dit:

    Ah ben quand même! Je croyais que t'allais pas le voir. :-D

    Je sais pas comment tu as fait d'ailleurs, j'ai eu que 113 petits points de vote moi. :'(

Laisser un commentaire

Azur Dev