Clase para mostrar fechas al estilo “hace 1 dia 6 min” con PHP
La mayoría de redes sociales como Twitter o Facebook en lugar de mostrar las fechas como 2011-11-18 utilizan un formato de “Hace 2 dias 4 horas 3 minutos“. Pasa usar ese formato en sus programas se pueden ayudar de la siguiente clase de PHP llamada haceTanto.
Esta clase la encontre por internet en formato ingles y la modifique para nuestro idioma y le agregue la opción de elegir una profundidad a la hora de mostrar fechas.

Importante
Esta clase solo funciona con PHP >= 5.3 ya que la función DateTime::diff() no se encuentra en versiones previas
Para utilizar la clase la llamamos de la siguiente forma:
1 2 3 | date_default_timezone_set('Europe/Madrid'); $hace = new haceTanto('2010-02-22 18:42:00','s'); echo 'Hace'.$hace; |
date_default_timezone_set('Europe/Madrid'); $hace = new haceTanto('2010-02-22 18:42:00','s'); echo 'Hace'.$hace;
- 1. Definimos el Timezone que nos encontramos
- 2. Creamos la instancia de haceTanto pasando dos valores.
- Una fecha por ejemplo: “2011-10-26”
- La profundidad hasta la que queremos mostrar siendo los posibles valores: ‘y’ => años ,’m’ => meses, ‘d’ => dias, ‘i’ => horas, ‘m’ => minutos, ‘s’ => segundos
- 3. Imprimimos la fecha
El ejemplo anterior imprime:
1 2 3 4 | date_default_timezone_set('Europe/Madrid'); $hace = new haceTanto('2010-02-22 18:42:00','s'); echo 'Hace'.$hace; //Hace 1 año 8 meses 27 dias 28 minutos 5 segundos |
date_default_timezone_set('Europe/Madrid'); $hace = new haceTanto('2010-02-22 18:42:00','s'); echo 'Hace'.$hace; //Hace 1 año 8 meses 27 dias 28 minutos 5 segundos
Y ahora la clase de PHP encargada de esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <?php class haceTanto extends DateTime { protected $strings = array( 'y' => array('1 año', '%d años'), 'm' => array('1 mes', '%d meses'), 'd' => array('1 día', '%d dias'), 'h' => array('1 hora', '%d horas'), 'i' => array('1 min', '%d minutos'), 's' => array('segundos', '%d segundos'), ); public $profundidad; public function __construct( $fecha,$profundidad='i') { parent::__construct( $fecha ); $this->profundidad = $profundidad; } public function __toString() { try { $now = new DateTime('now'); $diff = $this->diff($now); foreach($this->strings as $key => $value){ if( ($text .= ' '.$this->getDiffText($key, $diff)) ){ } if($this->profundidad == $key) break; } return $text; } catch(Exception $e) { trigger_error($e->getMessage(), E_USER_ERROR); return ''; } } protected function getDiffText($intervalKey, $diff){ $pluralKey = 1; $value = $diff->$intervalKey; if($value > 0){ if($value < 2){ $pluralKey = 0; } return sprintf($this->strings[$intervalKey][$pluralKey], $value); } return null; } } ?> |
<?php class haceTanto extends DateTime { protected $strings = array( 'y' => array('1 año', '%d años'), 'm' => array('1 mes', '%d meses'), 'd' => array('1 día', '%d dias'), 'h' => array('1 hora', '%d horas'), 'i' => array('1 min', '%d minutos'), 's' => array('segundos', '%d segundos'), ); public $profundidad; public function __construct( $fecha,$profundidad='i') { parent::__construct( $fecha ); $this->profundidad = $profundidad; } public function __toString() { try { $now = new DateTime('now'); $diff = $this->diff($now); foreach($this->strings as $key => $value){ if( ($text .= ' '.$this->getDiffText($key, $diff)) ){ } if($this->profundidad == $key) break; } return $text; } catch(Exception $e) { trigger_error($e->getMessage(), E_USER_ERROR); return ''; } } protected function getDiffText($intervalKey, $diff){ $pluralKey = 1; $value = $diff->$intervalKey; if($value > 0){ if($value < 2){ $pluralKey = 0; } return sprintf($this->strings[$intervalKey][$pluralKey], $value); } return null; } } ?>
Espero que les sirva de ayuda en sus proyectos. Saludos!!
Damián Logghe
Programador freelancer y emprendedor en sueños. Contento de ser mi jefe y poder hacer lo que me gusta. WordPress es mi principal fuente de ingreso y me escribo tanto para ayudar como para tener una guia de memoria. Quieres contratarme? Déjame un mensaje.