El siguiente código lo cree y utilizo en documentoweb para transformar un número de segundos a "hace cuanto pasó aquello".
Me explico. Por ejemplo, un comentario que fué publicado a las 4:30 y ahora son las 4:45. Pasaron 15 minutos desde que se publicó, y eso es lo que calcula la función, el tiempo en el que fue guardado algo comparado con el tiempo del momento en que se lee.
La función que yo llamo "hace_tiempo" está basada en la función time() del PHP. Lo que hace time es calcular la cantidad de segundos que hay desde el primero de enero de 1970 hasta los segundos del momento en que se ejecuta. Si guardamos en nuestra base de datos esta cifra generada adjunta al comentario (siguiendo el ejemplo) podremos jugar con esta función.
<?php
function hace_tiempo($valor){
// FORMATOS:
// segundos desde 1970 (función time()) hace_tiempo('12313214');
// defecto (variable $formato_defecto) hace_tiempo('12:01:02 04-12-1999');
// tu propio formato hace_tiempo('04-12-1999 12:01:02 [n.j.Y H:i:s]');
$formato_defecto="H:i:s j-n-Y";
// j,d = día
// n,m = mes
// Y = año
// G,H = hora
// i = minutos
// s = segundos
if(stristr($valor,'-') || stristr($valor,':') || stristr($valor,'.') || stristr($valor,',')){
if(stristr($valor,'[')){
$explotar_valor=explode('[',$valor);
$valor=trim($explotar_valor[0]);
$formato=str_replace(']','',$explotar_valor[1]);
}else{
$formato=$formato_defecto;
}
$valor = str_replace("-"," ",$valor);
$valor = str_replace(":"," ",$valor);
$valor = str_replace("."," ",$valor);
$valor = str_replace(","," ",$valor);
$numero = explode(" ",$valor);
$formato = str_replace("-"," ",$formato);
$formato = str_replace(":"," ",$formato);
$formato = str_replace("."," ",$formato);
$formato = str_replace(","," ",$formato);
$formato = str_replace("d","j",$formato);
$formato = str_replace("m","n",$formato);
$formato = str_replace("G","H",$formato);
$letra = explode(" ",$formato);
$relacion[$letra[0]]=$numero[0];
$relacion[$letra[1]]=$numero[1];
$relacion[$letra[2]]=$numero[2];
$relacion[$letra[3]]=$numero[3];
$relacion[$letra[4]]=$numero[4];
$relacion[$letra[5]]=$numero[5];
$valor = mktime($relacion['H'],$relacion['i'],$relacion['s'],$relacion['n'],$relacion['j'],$relacion['Y']);
}
$ht = time()-$valor;
if($ht>=2116800){
$dia = date('d',$valor);
$mes = date('n',$valor);
$año = date('Y',$valor);
$hora = date('H',$valor);
$minuto = date('i',$valor);
$mesarray = array('','Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre');
$fecha = "el $dia de $mesarray[$mes] del $año";
}
if($ht<30242054.045){$hc=round($ht/2629743.83);if($hc>1){$s="es";}$fecha="hace $hc mes".$s;}
if($ht<2116800){$hc=round($ht/604800);if($hc>1){$s="s";}$fecha="hace $hc semana".$s;}
if($ht<561600){$hc=round($ht/86400);if($hc==1){$fecha="ayer";}if($hc==2){$fecha="antes de ayer";}if($hc>2)$fecha="hace $hc días";}
if($ht<84600){$hc=round($ht/3600);if($hc>1){$s="s";}$fecha="hace $hc hora".$s;if($ht>4200 && $ht<5400){$fecha="hace más de una hora";}}
if($ht<3570){$hc=round($ht/60);if($hc>1){$s="s";}$fecha="hace $hc minuto".$s;}
if($ht<60){$fecha="hace $ht segundos";}
if($ht<=3){$fecha="ahora";}
return $fecha;
}
// Ejemplos
echo hace_tiempo("1271201645")."<br />";
echo hace_tiempo("20:34:05 13-04-2010")."<br />";
echo hace_tiempo("2010-04-13 20:34:05 [Y-n-j H:i:s]")."<br />";
?>
Primero que nada guardar el código integrándolo al principio del documento. Al obtener el número (el time() que se guardó con anterioridad) de la base de datos e ingresandolo en una variable ($numero) solo debemos llamar a la función para que trabaje y de el resultado de la siguiente forma:
<?php echo hace_tiempo($numero); ?>
Así podría decir: hace 20 segundos, hace 1 minuto, hace 2 horas, hace 1 semana, hace más de 1 hora, etc. dependiendo del número. Está programado hasta 3 semanas, si el tiempo exede se muestra como "el dia X del mes X del año X". El tiempo se puede extender si se sigue la misma lógica del código PHP con un estudio de cuantos segundos hay en un mes, dos meses, un año, etc.
Es muy conveniente usar esta o una función similar porque elimina la complejidad de los distintos horarios que hay en el mundo. No en todo el mundo son las 5 de la tarde, pero 5 minutos o 5 horas transcurridos son igual para todos.
Si decimos en la web "publicado el 08 de abril del 2010 a las 5:05pm" siendo que hoy es 08 de abril del 2010 y son las 9:00pm, es mucho pero mucho mejor para el lector decirle que transcurrieron 4 horas a darle tanta molestia de leer esa catastrófica frase para compararla con la fecha actual y calcular hace cuanto tiempo pasó aquello.
Ahora en el código puedes ingresarle cualquier formato de fechas. En el mismo están las instrucciones.
Postear en Twitter
Postear en Facebook
Feed RSS
Agregar a Favoritos
1 el 09 de Abril del 2010:
0
pero si mi fecha esta en esta sintaxis
date("Y-m-d H:i:s");
no puedes crear otro codigo para que funcione con esta sintaxis de la fecha date("Y-m-d H:i:s")
Diego Escares el 10 de Abril del 2010:
0
Hay una función inversa que vuelca una la sintaxis H:i:s n-j-Y (bien parecida a lo que quieres, solo que sin ceros al principio) y se llama mktime().
El número que necesitamos podemos crearlo de la siguiente forma:
$numero = mktime(horas,minutos,segundos,mes,día,año);
Por ejemplo:
$numero = mktime(18,29,3,9,30,2010);
De esta forma la fecha de hoy sería:
$numero = mktime(date("H"),date("i"),date("s"),date("n"),date("j"),date("Y"));
Que es igual a ejecutar time().
1 el 10 de Abril del 2010:
0
¿Cuáles son los valores que usas para esa función? es decir en donde dice $valor va la fecha que sacas con date ¿pero qué valores usas adentro de date?.
Es que no logré hacer funcionar la función.
Diego Escares el 10 de Abril del 2010:
0
¿Querrás decir $numero? No debe tener el valor que se saca con date(), es el valor de time(). Por ende, en el comentario anterior te mostré como transformar de un valor date() del formato H:i:s n-j-Y a time() en el formato numérico que es el que nos sirve.
Por ejemplo, no podemos hacer la función como hace_tiempo("14:39:14 04-10-2010"), si no que debe ser hace_tiempo("1270921154") y para ello la fecha anterior se puede convertir con mktime() de la forma: hace_tiempo(mktime(14,39,14,04,10,2010)), lo que daría un resultado idéntico al anterior.
1 el 11 de Abril del 2010:
0
porque cuando pongo
echo hace_tiempo(date("H:i:s n-j-Y"));
me dice
el 01 de Enero del 1970
acaso estoy inplemetando mal la funcion o no funciona su codigo O_O!
Diego Escares el 11 de Abril del 2010:
0
Parece que no estas leyendo mis comentarios... trata de comprender este:
// mktime(hora,minutos,segundos,mes,dia,año);
echo hace_tiempo(mktime(14,39,14,04,11,2010));
Y si funciona, lo puedes ver en toda la página: por ejemplo, al lado de tu nick en cada comentario.
1 el 12 de Abril del 2010:
0
disculpa no puedes poner un archivo descargable?
esque no me sale, no logro aserlo funcionar esque mi fecha esta en este formato
date("Y-m-d H:i:s");
y tu funcion funciona con time o miketime
¿tendre que realizar una convercion de date a time o miketime?
1 el 13 de Abril del 2010:
0
seria mejor si pusieras algun ejemplo para descargar, gracias
Diego Escares el 13 de Abril del 2010:
0
Espera, estoy mejorando la función para que puedas meterle directamente una fecha en cualquier formato =)
Diego Escares el 14 de Abril del 2010:
0
Prueba el nuevo código ^^
1 el 14 de Abril del 2010:
+1
Gracias ya logre que funcionara despues de 5 días...
Diego Escares el 17 de Abril del 2010:
0
Más vale tarde que nunca =)
James el 23 de Abril del 2010:
0
Hola, gracias por la funcion pero no logro hacerla funcionar.
Me sale el siguiente error.
Notice: Undefined variable: s in E:\software\UsbWebserver\Root\timeago\timeago.php on line 68
Notice: Undefined variable: s in E:\software\UsbWebserver\Root\timeago\timeago.php on line 69
hace 1 semana
E copiado y pegado tu funcion, cual puede ser el error?
Gracias
Diego Escares el 25 de Abril del 2010:
0
A mi me funciona perfecto, el error puede que se deba a tu versión del PHP, porque cuando no se definen las variables ya no importa porque el resultado es el mismo. Agrega antes de la linea 68: $s=""; y listo.
k.O el 05 de Enero del 2011:
0
muy buena funcion la estoy utilizando y ya esta implantada pero a la hora de que hago el comentario en vez de poner "ahora" pone "hace 5 horas" porque cees tu que sea eso?
Diego Escares el 06 de Enero del 2011:
0
Te saldrá "hace 5 horas" solo si la fecha que pusiste fue hace cinco horas :P. Verifica bien la fecha.
k.O el 11 de Enero del 2011:
0
no no porque como te dije yo al comentar lo primero que me coloca es eso. y la funcion date me toma la fecha y la hora bien , de verdad no se que podria ser ..
Diego Escares el 11 de Enero del 2011:
0
raro, no sé que puede ser :P
diegoacco hace 6 días:
0
Muchísimas gracias por la función, funciona perfectamente y es exactamente lo que estaba buscado. Abrazo!
¡Amigo! te demorarás 10 segundos en crear tu cuenta.
Disfrutarás de todos los beneficios de DocumentoWeb.