2008-08-20 8 views
22

Quelqu'un peut-il me dire comment je peux afficher un message d'état comme "il y a 12 secondes" ou "5 minutes auparavant" dans une page Web?Comment afficher "12 minutes auparavant" etc dans une page Web PHP?

+0

Cette question a été [précédemment demandé] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time), l'exemple de code dans les réponses devrait être assez facile à convertir en PHP. – Wedge

+1

Cela a été couvert (bien qu'avec plus de focus C#) dans [ce thread] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time). –

+0

bonne question :) – xRobot

Répondre

63

Voici le code php pour le même:

function time_since($since) { 
    $chunks = array(
     array(60 * 60 * 24 * 365 , 'year'), 
     array(60 * 60 * 24 * 30 , 'month'), 
     array(60 * 60 * 24 * 7, 'week'), 
     array(60 * 60 * 24 , 'day'), 
     array(60 * 60 , 'hour'), 
     array(60 , 'minute'), 
     array(1 , 'second') 
    ); 

    for ($i = 0, $j = count($chunks); $i < $j; $i++) { 
     $seconds = $chunks[$i][0]; 
     $name = $chunks[$i][1]; 
     if (($count = floor($since/$seconds)) != 0) { 
      break; 
     } 
    } 

    $print = ($count == 1) ? '1 '.$name : "$count {$name}s"; 
    return $print; 
} 

La fonction prend le nombre de secondes que l'entrée et les sorties texte tel que:

  • 10 secondes
  • 1 minute

etc

+0

Belle fonction :) – AntonioCS

+0

Oh et n'oubliez pas de changer ces multiplications avec les valeurs réelles, de sorte qu'il ne sera pas calculé à chaque fois qu'il s'exécute: – AntonioCS

+10

Comme j'étais curieux, le remplacement des séquences de multiplication par les produits évalués était ~ 1,2% plus rapide. –

7
function timeAgo($timestamp){ 
    $datetime1=new DateTime("now"); 
    $datetime2=date_create($timestamp); 
    $diff=date_diff($datetime1, $datetime2); 
    $timemsg=''; 
    if($diff->y > 0){ 
     $timemsg = $diff->y .' year'. ($diff->y > 1?"'s":''); 

    } 
    else if($diff->m > 0){ 
    $timemsg = $diff->m . ' month'. ($diff->m > 1?"'s":''); 
    } 
    else if($diff->d > 0){ 
    $timemsg = $diff->d .' day'. ($diff->d > 1?"'s":''); 
    } 
    else if($diff->h > 0){ 
    $timemsg = $diff->h .' hour'.($diff->h > 1 ? "'s":''); 
    } 
    else if($diff->i > 0){ 
    $timemsg = $diff->i .' minute'. ($diff->i > 1?"'s":''); 
    } 
    else if($diff->s > 0){ 
    $timemsg = $diff->s .' second'. ($diff->s > 1?"'s":''); 
    } 

$timemsg = $timemsg.' ago'; 
return $timemsg; 
} 
+0

J'ai utilisé une version modifiée de ceci, j'ai remplacé la ligne date_create par $ datetime2 = new DateTime(); $ datetime2-> setTimestamp ($ timestamp); et supprimé toutes les apostrophes avant la chaîne s – Oliverb

3

\DateTime::diff de PHP renvoie un objet \DateInterval sur lequel vous pouvez obtenir les minutes par la propriété publique i.

Questions connexes