Pergunta

Estou criando comentários armazenados em um banco de dados MySQL.

Estou registrando a função time do php time() conforme o comentário é postado.Dessa forma, ele está exibindo uma mensagem como ..."Comente...postado 4 segundos atrás" e se eu atualizar a página 2 minutos depois, ele exibiria "comentário...postado há 2 minutos"

É assim que estou entrando time() no banco de dados junto com os outros dados:

$date=time();

// Insert data into mysql
$sql="INSERT INTO testimonials (username, comment, date) 
  VALUES ('$username', '$comment', '$date')";

Agora...Eu pego os dados assim:

while ($row = mysql_fetch_row($result) )
{
  echo "<b>Random Comment</b></br>";
  echo ("<p>\n> $row[1]"); //comment
  echo ("</br>-$row[0]</p>"); //name
  echo ("</br>$row[2]"); //date

O exemplo de saída no meu servidor é:

Comentário aleatório

Esse é o comentário mais incrível de todos os tempos!!!!

-Kyle

1278905319

Como eu poderia converter a hora "1278905319" em um formato legível, como "postado há 4 segundos" ou algo que lide com segundos, minutos, horas, dias, semanas, meses, anos?

PHP é a maneira errada de fazer isso?Eu li sobre carimbo de data / hora do MySQL, mas não entendo isso ou como fazê-lo funcionar no meu caso.

Portanto, minha principal questão é: como formatar o horário em um horário legível na saída."2 segundos atrás"

Obrigado.=)

Foi útil?

Solução

Aqui está uma função que encontrei aqui, escrito por John McClumpha:

<?php
function RelativeTime($timestamp){
    $difference = time() - $timestamp;
    $periods = array("sec", "min", "hour", "day", "week", "month", "years", "decade");
    $lengths = array("60","60","24","7","4.35","12","10");

    if ($difference > 0) { // this was in the past
        $ending = "ago";
    } else { // this was in the future
        $difference = -$difference;
        $ending = "to go";
    }       
    for($j = 0; $difference >= $lengths[$j]; $j++) $difference /= $lengths[$j];
    $difference = round($difference);
    if($difference != 1) $periods[$j].= "s";
    $text = "$difference $periods[$j] $ending";
    return $text;
}

Outras dicas

Primeiro, deixe o MySQL inserir a data para você usando um campo de carimbo de data/hora com atualização automática:

CREATE TABLE `table_a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255),
  `comment` TEXT,
  `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Dessa forma, você não precisa se preocupar em inserir a data do seu código PHP, e se fizer algum teste de outro lugar - do cliente MySQL, por exemplo, a data ainda será inserida corretamente.

Você também deve usar o Classe DateTime PHP (requer PHP 5.3.0 ou superior), pois torna o trabalho com datas e horas bastante simples.Aqui está um exemplo de obtenção de algumas informações do banco de dados e retorno de um intervalo de tempo formatado:

$result = $mysqli->query(
    'SELECT ' .
    '`id`, ' .
    '`username`, ' .
    '`comment`, ' .
    '`date`, ' .
    'NOW(), ' .
    'FROM table');

$row = $result->fetch_assoc();

print_r($row);
Array
(
    [id] => 1
    [username] = 'Fred'
    [comment] = 'My first post'
    [date] => 2009-09-28 07:08:12
    [now] => 2010-07-12 08:47:03
)

$now = new DateTime($row['now']);
$post = new DateTime($row['date']);
$interval = $post->diff($now);
echo $interval->format('%m months, %d days, %d days, %h hours, %m minutes, %s seconds');

// 9 months, 14 days, 14 days, 1 hours, 9 minutes, 51 seconds

Você pode formatar o intervalo como quiser usando o DateInterval::formato parâmetros.Fazendo o MySQL retornar NOW(), você garante que qualquer discrepância de tempo entre o servidor de aplicativos (aquele que executa o PHP) e o servidor de banco de dados seja evitada.

Se você precisar de cálculos de tempo complexos, confira o DateHelper do symfony, especialmente distance_of_time_in_words como encontrado no fonte.Este é um método muito poderoso que conhece um cálculo de tempo muito refinado (por exemplo,5 segundos atrás, 20 segundos atrás, cerca de 1 minuto atrás, 10 minutos atrás,...)


Se você quer apenas ter o data formatada, você pode formatá-lo via MySQL:

SELECT your_fields, FROM_UNIXTIME(date, 'H:%i:%s') FROM table;

daria a você 12:24:59, por exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top