¿Cómo mostrar "hace 12 minutos", etc. en una página web de PHP?


22

¿Alguien puede decirme cómo puedo mostrar un mensaje de estado como "12 segundos atrás" o "5 minutos atrás", etc. en una página web?

  0

Esta pregunta fue [previamente solicitada] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time), el código de ejemplo en las respuestas debería ser bastante fácil de convertir a PHP. 20 ago. 082008-08-20 20:07:06

+1

Esto se ha cubierto (aunque con más de un enfoque de C#) en [este hilo] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time). 20 ago. 082008-08-20 20:05:18

  0

gran pregunta :) 24 abr. 132013-04-24 12:30:28

  0

Hay un buen plugin jquery: timeago.js 27 abr. 132013-04-27 04:46:05

63

Aquí está el código php para el mismo:

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 función toma el número de segundos como entrada y salidas de texto como:

  • 10 segundos
  • 1 minuto

etc

  0

Nice function :) 23 ago. 092009-08-23 20:44:54

  0

Ah, y no olvides cambiar esas multiplicaciones con los valores reales, para que no se calcule cada vez que se ejecute:) 23 ago. 092009-08-23 21:07:39

+10

Como era curioso, el reemplazo de las secuencias de multiplicación con los productos evaluados fue ~ 1.2% más rápido. 24 ago. 092009-08-24 01:04:06

+5

Solo muestra '33 minutos' sin importar que cambie la fecha y la hora también 24 feb. 132013-02-24 18:18:02

+5

@ErikEdgren Tuve el mismo problema porque estaba enviando la fecha en lugar de los segundos. Pruebe esto: 'time_since (time() - strtotime ($ datetime))' 02 ago. 132013-08-02 15:12:54

  0

TWEAK WITH NOW NOW. función time_since ($ since) { \t $ chunks = array (matriz (60 * 60 * 24 * 365, 'año'), matriz (60 * 60 * 24 * 30, 'mes'), matriz (60 * 60 * 24 * 7, 'semana'), conjunto (60 * 60 * 24, 'día'), conjunto (60 * 60, 'hora'), conjunto (60, 'minuto'), conjunto (1, 'segundo')); \t for ($ i = 0, $ j = count ($ chunks); $ i <$ j; $ i ++) { \t \t $ seconds = $ chunks [$ i] [0]; \t \t $ name = $ chunks [$ i] [1]; \t $ count = piso ($ desde/$ segundos); \t if ($ count! = 0) {break;} \t} if ($ count == 1) {\t \t return $ print = '1'. $ Nombre;} else if ($ count <1) {return \t $ print = 'just now'; \t} else {\t return $ print = "$ count {$ name} s";}} 31 ene. 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

Utilicé una versión modificada de esto, reemplacé la línea date_create con $ datetime2 = new DateTime(); $ datetime2-> setTimestamp ($ timestamp); y eliminó todos los apóstrofos antes de la cadena s 02 ago. 162016-08-02 09:30:10


3

PHP \DateTime::diff devuelve un objeto \DateInterval en el que puede obtener los minutos por la propiedad pública i.