Comment afficher "12 minutes auparavant" etc dans une page Web PHP?


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?

  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. 20 août. 082008-08-20 20:07:06

+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). 20 août. 082008-08-20 20:05:18

  0

bonne question :) 24 avril. 132013-04-24 12:30:28

  0

Il ya un joli plugin jquery: timeago.js 27 avril. 132013-04-27 04:46:05

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 :) 23 août. 092009-08-23 20:44:54

  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: 23 août. 092009-08-23 21:07:39

+10

Comme j'étais curieux, le remplacement des séquences de multiplication par les produits évalués était ~ 1,2% plus rapide. 24 août. 092009-08-24 01:04:06

+5

Il montre seulement '33 minutes', peu importe ce que je change la date et l'heure aussi 24 févr.. 132013-02-24 18:18:02

+5

@ ErikEdgren J'ai eu le même problème parce que je envoyais la date au lieu de secondes. Essayez ceci: 'time_since (time() - strtotime ($ datetime))' 02 août. 132013-08-02 15:12:54

  0

TWEAK AVEC JUST NOW. function time_since ($ depuis) ​​{ \t $ chunks = array (array (60 * 60 * 24 * 365, 'year'), array (60 * 60 * 24 * 30, 'month'), array (60 * 60 * 24 * 7, 'semaine'), tableau (60 * 60 * 24, 'jour'), ​​tableau (60 * 60, 'heure'), tableau (60, 'minute'), tableau (1, 'sec')) \t pour ($ i = 0, $ j = nombre ($ morceaux); $ i <$ j; $ i ++) { \t \t $ seconds = $ chunks [$ i] [0]; \t \t $ name = $ chunks [$ i] [1]; \t $ count = floor ($ depuis/$ secondes); \t if ($ count = 0) {break;} \t} if ($ count == 1) {\t \t retour print $ = '1' $ name;.} Else if ($ count <1) {return \t $ print = 'juste maintenant'; \t} else {\t return $ print = "$ nombre {$ name} s";}} 31 janv.. 182018-01-31 23:26:33


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 02 août. 162016-08-02 09:30:10


3

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