Calcular hace cuanto se hizo la publicación en PHP

Estoy seguro que en algún momento te has preguntado como es que en Twitter, Facebook o Instagram no aparece la fecha de publicación, sino, hace cuanto se hizo la publicación. Hace cuanto o cuando se hizo la publicación es una referencia mucho más intuitiva que colocar la fecha por si misma.

Esto se debe en particular a que como se publican millones de datos en las redes poner las fechas con hora y segundos sería una cadena de caracteres bastante larga sin mencionar lo no muy agradable visualmente que esto refleja y por supuesto el espacio reducido que puede visualizar el usuario en su smartphone.

Para esto se utiliza una pequeña función que evalúa la fecha/hora de publicación almacenada en la base de datos en relación a la fecha actual en que el usuario despliega la publicación o en buen español, cuando la ve.

Vamos a programar esta función en PHP para que podamos utilizarla en nuestros proyectos. Partiendo de que nuestra fecha de publicación está almacenada como TIMESTAMP en una base de datos Mysql. Puedes buscar la equivalente para cualquier otra plataforma de base de datos y hacer la conversión basada en formato de fechas de Unix, es decir, la cantidad de segundos desde enero 1 de 1970.

En resumen, lo que haremos es tomar la fecha de la publicación, convertirla con strtotime() y restarla a la fecha/hora actual al momento de desplegar o visualizar la publicación por el usuario. Finalmente basado en este resultado compararemos este con la cantidad de segundos que representa cada unidad de medida de tiempo en Unix (día, hora, minuto, segundo). También pueden hacerlo para semanas, meses e incluso años.

function time_passed($get_timestamp)
{
        $timestamp = strtotime($get_timestamp);
        $diff = time() - (int)$timestamp;

        if ($diff == 0) 
             return 'justo ahora';

        if ($diff > 604800)
            return date("d M Y",$timestamp);

        $intervals = array
        (
            //1                   => array('año',    31556926),
           // $diff < 31556926    => array('mes',   2628000),
           // $diff < 2629744     => array('semana',    604800),
            $diff < 604800      => array('día',     86400),
            $diff < 86400       => array('hora',    3600),
            $diff < 3600        => array('minuto',  60),
            $diff < 60          => array('segundo',  1)
        );

        $value = floor($diff/$intervals[1][1]);
        return 'hace '.$value.' '.$intervals[1][0].($value > 1 ? 's' : '');
}

¿Que hemos hecho?

Hemos capturado el valor de la fecha que deseamos evaluar por medio del parámetro $get_timestamp que pasamos a la funcióm time_passed:

function time_passed($get_timestamp){...}

Convertimos el timestamp a formato de fecha Unix:

$timestamp = strtotime($get_timestamp);

Calculamos la diferencia de segundos restando la fecha de la publicación a la fecha actual:

$diff = time() - (int)$timestamp;

Si la difernecia es 0, significa que fué publicada justo ahora, retornamos el texto ‘justo ahora’:

if ($diff == 0) 
             return 'justo ahora';

Si la diferencia es mayor a un día (604,800 segundos), retornamos la fecha:

if ($diff > 604800)
            return date("d M Y",$timestamp);

Aquí está es truco. En la comparación anterior le estamos indicando a la función que si la diferencia es mayor a 24 horas, imprima la fecha (día mes año). Si deseamos que en su lugar continúe evaluando lapsos mayores sustituimos la cantidad de segundos por la equivalencia mayor al que deseamos evaluar para que continúe desplegando hace cuanto fue publicado y no la fecha. Por ejemplo, si comparamos contra 2629744, evaluaremos contra una semana por lo que la publicación desplegaría la cantidad de días antes de que cumple una semana, luego de este intervalo (1-2629744) desplegará la fecha.

Entonces para comparar los intervalos de segundo, minuto, hora y día. Crearemos un arreglo o matriz (array) para capturar y evaluar los lapsos a partir de cuando deseamos desplegar la fecha:

$intervals = array
        (
            //1                   => array('año',    31556926),
           // $diff < 31556926    => array('mes',   2628000),
           // $diff < 2629744     => array('semana',    604800),
            $diff < 604800      => array('día',     86400),
            $diff < 86400       => array('hora',    3600),
            $diff < 3600        => array('minuto',  60),
            $diff < 60          => array('segundo',  1)
        );

Notarán que he comentado semana, mes y año del arreglo de intervalos. Esto debido a que previamente he comparado con cero (0) y con un día (604800), siendo este último mi mayor lapso a partir de cuando desplegará la fecha y no hace cuanto se hizo la publicación.

Finalmente, aplicamos floor() para convertir en número entero el valor de la diferencia entre la fecha de publicación y la fecha actual. De esta forma aseguramos que siempre devolverá un valor entero (integer).

$value = floor($diff/$intervals[1][1]);

Luego de evaluar el resultado devolvemos el valor para mostrarlo al usuario, agregando el prefijo ‘hace’, concatenado con el valor de la diferencia y seguido por el nombre de la unidad, y si es mayor a una unidad del intervalo agregamos ‘s’ para evocar el plural de la unidad:

return 'hace '.$value.' '.$intervals[1][0].($value > 1 ? 's' : '');

Para utilizar la función solo necesitas llamarla en tu código. Una buena práctica es devolver valores en una función, no imprimirlos. Imprimimos el retorno de la función:

<?php echo time_passed(date('m-d-Y H:i:s')); ?>

Listo! así es como lo hacen Facebook, Twitter, Instagram, Google+, y muchos diarios y portales incluyendo www.elmasacre.com en Internet para desplegar la forma más intuitiva la fecha de publicación de un post, artículo o comentario.

CODE IS POETRY!