Come visualizzare "12 minuti fa" ecc. In una pagina Web PHP?


22

Qualcuno può dirmi come posso visualizzare un messaggio di stato come "12 secondi fa" o "5 minuti fa" ecc. In una pagina Web?

  0

Questa domanda è stata [precedentemente chiesta] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time), il codice di esempio nelle risposte dovrebbe essere abbastanza facile da convertire in PHP. 20 ago. 082008-08-20 20:07:06

+1

Questo è stato trattato (sebbene con più di un focus C#) in [questo thread] (http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time). 20 ago. 082008-08-20 20:05:18

  0

ottima domanda :) 24 apr. 132013-04-24 12:30:28

  0

C'è un bel plugin jquery: timeago.js 27 apr. 132013-04-27 04:46:05

63

Ecco il codice php per lo stesso:

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 funzione prende il numero di secondi come testo di input ed output come:

  • 10 secondi
  • 1 minuto

ecc

  0

Bella funzione :) 23 ago. 092009-08-23 20:44:54

  0

Oh e non dimenticare di cambiare quelle moltiplicazioni con i valori reali, in modo che non venga calcolato ogni volta che viene eseguito: 23 ago. 092009-08-23 21:07:39

+10

Poiché ero curioso, la sostituzione delle sequenze di moltiplicazione con i prodotti valutati era ~ 1,2% più veloce. 24 ago. 092009-08-24 01:04:06

+5

Mostra solo '33 minuti', non importa cosa cambio la data e l'ora 24 feb. 132013-02-24 18:18:02

+5

@ErikEdgren Ho avuto lo stesso problema perché stavo inviando la data invece dei secondi. Prova questo: 'time_since (time() - strtotime ($ datetime))' 02 ago. 132013-08-02 15:12:54

  0

TWEAK WITH JUST NOW. function time_since ($ since) { \t $ chunks = array (array (60 * 60 * 24 * 365, 'year'), array (60 * 60 * 24 * 30, 'month'), array (60 * 60 * 24 * 7, 'settimana'), array (60 * 60 * 24, 'giorno'), array (60 * 60, 'hour'), ​​array (60, 'minute'), array (1, 'sec')); \t per ($ i = 0, $ j = conteggio ($ blocchi); $ i <$ j; $ i ++) { \t \t $ secondi = $ pezzi [$ i] [0]; \t \t $ name = $ chunks [$ i] [1]; \t $ count = floor ($ since/$ secondi); \t if ($ count! = 0) {break;} \t} if ($ count == 1) {\t \t return $ print = '1'. $ Name;} else if ($ count <1) {return \t $ print = 'solo ora'; \t} else {\t return $ print = "$ count {$ name s";}} 31 gen. 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

Ho usato una versione modificata di questo, ho sostituito la riga date_create con $ datetime2 = new DateTime(); $ datetime2-> setTimestamp ($ timestamp); e rimosso tutti gli apostrofi prima della stringa s 02 ago. 162016-08-02 09:30:10


3

PHP \DateTime::diff restituisce un oggetto \DateInterval su cui è possibile ottenere i minuti dalla proprietà pubblica i.