Categorias

Calcular diferença entre datas e mostrar uma mensagem personalizada

O objetivo deste código é exibir uma mensagem personalizada de acordo com o tempo decorrido desde uma determinada data.
É um sistema similar ao utilizado no Twitter, onde cada tuíte é acompanhado de uma mensagem na timeline: “1 minute ago” (“há um minuto”). Conforme o tempo vai passando, a mensagem muda.

### Função para calcular a diferença entre datas e mostrar uma mensagem personalizada ###
 ### Por @JoaoRicardo_RM / [email protected] ###
 ### livre para modificações ###
 
 #### para chamar a função bastar usar data(data_do_banco) formato americano. Ex: data(2011-03-19 20:47:32) ####

 // define o fuso horário. No caso o meu é de caracas. Só para a hora do servidor bater corretamente. 
 // veja mais fusos aqui https://www.php.net/manual/pt_BR/timezones.php
 date_default_timezone_set('America/Caracas'); 

 function data($data){ // criamos a função 
  $data_atual = mktime(); // data atual em segundos
 
  // a data vem do banco de dados então ela está no formato americano.
  // se sua data está no formato dd/mm/aaaa hh:mm:ss basta descomentar (tirar as duas barras //) a linha de baixo
  //date("Y-m-d H:i:s",$data); 
  
  // separamos as partes da data 
  list($ano,$mes,$dia) = explode("-",$data);
  list($dia,$hora) = explode(" ",$dia);
  list($hora,$min,$seg) = explode(":",$hora);
  // transformamos a data do banco em segundos usando a função mktime()
  $data_banco = mktime($hora,$min,$seg,$mes,$dia,$ano); 

  $diferenca = $data_atual - $data_banco; // subtraímos a data atual menos a data do banco em segundos
 
  $minutos = $diferenca/60; // dividimos os segundos por 60 para transformá-los em minutos
  $horas = $diferenca/3600; // dividimos os segundos por 3600 para transformá-los em horas
  $dias = $diferenca/86400; // dividimos os segundos por 86400 para transformá-los em dias
  
  // abaixo fazemos verificações para definir a mensagem a ser mostrada.
	   
  if($minutos < 1){ // se a tiver passado de 0 a 60 segundos
   $diferenca = "há alguns segundos. Mais precisamente: ".$diferenca." segundos";
  } elseif($minutos > 1 && $horas < 1) { // se tiver passado de 1 a 60 minutos
   if(floor($minutos) == 1 or floor($horas) == 1){ $s = ''; } else { $s = 's'; } // plural ou singular de minuto   
   $diferenca = "há ".floor($minutos)." minuto".$s;
  } elseif($horas <= 24) { // se tiver passado de 1 a 24 horas
   if(floor($horas) == 1){ $s = ''; } else { $s = 's'; } // plural ou singular de hora   
   $diferenca = "há ".floor($horas)." hora".$s;
  } elseif($dias <= 2){ // se tiver passado um dia 
   $diferenca = "ontem";
  } elseif($dias <= 7){ // se tiver passado 6 dias 
   $diferenca = "há ".floor($dias)." dias";
  } elseif($dias <= 8){ // se tiver passado uma semana (7 dias)
   $diferenca = "há uma semana";
  } else {
   $diferenca = date("d/m/Y",$data_banco);
  } 
  
  return $diferenca; // mostramos a mensagem com a diferença de tempo
 }