Foros del Web » Programando para Internet » PHP »

Calcular el tiempo pasado, horas/dias/semanas/ ago..".

Estas en el tema de Calcular el tiempo pasado, horas/dias/semanas/ ago..". en el foro de PHP en Foros del Web. Hola, seguro ya habrán visto aquel sistema en los comentarios para mostrar el tiempo pasado desde que se publicó. Ejemplo: "Hace 2 días" "Hace 2 ...
  #1 (permalink)  
Antiguo 22/04/2009, 08:57
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Calcular el tiempo pasado, horas/dias/semanas/ ago..".

Hola, seguro ya habrán visto aquel sistema en los comentarios para mostrar el tiempo pasado desde que se publicó.
Ejemplo:
"Hace 2 días"
"Hace 2 semanas"
etc.

En Youtube por ejemplo está presente, bueno y en muchos otros.

No encuentro la manera de hacerlo bien, incluso estuve probando funciones prefabricadas pero no hay manera, me tira cualquier dato.
Por ejemplo, la siguiente función.. a pesar de pasarle un "timestamp" reciente, el resultado es "hace 2 semanas".
Código PHP:
function timeDiff($timestamp){

        
$now time();

        
//If the difference is positive "ago" - negative "away"
        
($timestamp >= $now) ? $action 'away' $action 'ago';

        switch(
$action) {
        case 
'away':
                
$diff $timestamp $now;
                break;
        case 
'ago':
        default:
                
// Determine the difference, between the time now and the timestamp
                
$diff $now $timestamp;
                break;
        }

        
// Set the periods of time
        
$periods = array("second""minute""hour""day""week""month""year""decade");

        
// Set the number of seconds per period
        
$lengths = array(160360086400604800263088031570560315705600);

        
// Go from decades backwards to seconds
        
for ($val sizeof($lengths) - 1; ($val >= 0) && (($number $diff $lengths[$val]) <= 1); $val--);

        
// Ensure the script has found a match
        
if ($val 0$val 0;

        
// Determine the minor value, to recurse through
        
$new_time $now - ($diff $lengths[$val]);

        
// Set the current value to be floored
        
$number floor($number);

        
// If required create a plural
        
if($number != 1$periods[$val].= "s";

        
// Return text
        
$text sprintf("%d %s "$number$periods[$val]);
        return 
$text $action;

¿Entonces?, si alguien conoce alguna función eficiente o bien decirme que estoy haciendo mal, el por qué me lanza datos equivocados.

Gracias.

Última edición por Xixy; 23/04/2009 a las 10:36
  #2 (permalink)  
Antiguo 22/04/2009, 09:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

yo re-escribi esta función de Twitter, se usa para hacer lo que dices....

la limitante, es que solo sirve para distancia en días... y menos

originalmente estaba en Javascript, pero igual... la teoría es simple, así que fácilmente puedes agregar semanas, meses... o años!

Código PHP:
/**
    * (desde[, hasta])
    *
    * Devuelve la diferencia textual entre dos fechas.
    */
function between($past ''$now '')
{
    
$past is_string($past)? strtotime($past): (int) $past;
    
$now is_string($now)? strtotime($now): (int) $now;
    
$now $now <= 0time(): $now;// --

    // restamos..
    
$diff $now $past;

    if (
$diff 60)
    {
        return 
'menos de un minuto';
    }
    else
    {
        if (
$diff 120)
        {
            return 
'hace un minuto';
        }
        else
        {
            if (
$diff < (60 *60))
            {
                return 
'hace ' . ($diff /60) . ' minutos';
            }
            else
            {
                if (
$diff < (120 *60))
                {
                    return 
'hace una hora';
                }
                else
                {
                    if (
$diff < (24 *60 *60))
                    {
                        return 
'hace ' . ($diff /3600) . ' horas';
                    }
                    else
                    {
                        if (
$diff < (48 *60 *60))
                        {
                            return 
'hace un dia';
                        }
                        else
                        {
                            return 
'hace ' . ($diff /86400) . ' dias';
                        }
                    }
                }
            }
        }
    }


espero te sirva, suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 22/04/2009, 15:09
Avatar de dyegox  
Fecha de Ingreso: enero-2008
Mensajes: 173
Antigüedad: 16 años, 10 meses
Puntos: 7
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

justo lo que buscaba una pregunta ese script en
function between($past = '', $now = '')
en que formato hay que poner la fecha¡¡¡
es que ahce tiempo que lo busco y nada XD
  #4 (permalink)  
Antiguo 22/04/2009, 15:23
f0n
 
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

Acostumbrate a poner un sólo return por función y al final de ella.
Lo de suprimir las llaves sería quizás ser demasiado tiquismiquis pero no empeoraría la legibilidad desde luego.
Un saludo
  #5 (permalink)  
Antiguo 22/04/2009, 15:25
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

Hola, f0n.

¿Por qué hay que usar un sólo return por función?

Por lo menos en el manual de PHP o en el estándar de Zend Framework no recuerdo haber leído al respecto.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 22/04/2009, 16:48
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

los parámetros pueden ser de los siguientes "tipos":
- timestamp osea... un entero de diez dígitos (por ej. time()/strtotime())
- datetime osea... una cadena con una fecha textual simple (o en ingles, ver manual strtotime()/date())

* el segundo parámetro es opcional....

ejemplos

Código PHP:
$a strtotime('-1 hour');
$b date('Y-m-d H:i:s'time() -900);
$c date('Y-m-d H:i:s'strtotime($b) +300);

echo 
between($a); // hace una hora
echo between($b$c); // hace 5 minutos 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 23/04/2009, 06:42
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

Hola, tengo una duda al mostrar el tiempo.. utilizo la función así:
$fecha = recibe un valor time().
echo between($fecha);
y me muestra:
hace 14357.52724537 dias

Lo raro es que es el mismo resultado para TODAS las fechas de los distintos comentarios. Será que estoy pasando mal el parametro, es un simple time().

Gracias.
  #8 (permalink)  
Antiguo 23/04/2009, 13:01
Avatar de dyegox  
Fecha de Ingreso: enero-2008
Mensajes: 173
Antigüedad: 16 años, 10 meses
Puntos: 7
Respuesta: Calcular el tiempo pasado, horas/dias/semanas/ ago..".

Hola he creado esta funcion:

Código PHP:
<?php
function dateDiff($from,$to) {
  
$diff $to $from;
  
$info = array();
  if(
$diff>315569260) {
    
// Decadas
    
$info['decadas'] = ($diff - ($diff&#37;315569260))/315569260;
    
$diff $diff%315569260;
  }
  elseif(
$diff>31556926) {
    
// Años
    
$info['años'] = ($diff - ($diff%31556926))/31556926;
    
$diff $diff%31556926;
  }
   elseif(
$diff>2629743) {
    
// Meses
    
$info['meses'] = ($diff - ($diff%2629743))/2629743;
    
$diff $diff%2629743;
  }
  elseif(
$diff>604800) {
    
// Semanas
    
$info['semanas'] = ($diff - ($diff%604800))/604800;
    
$diff $diff%604800;
  }
  elseif(
$diff>86400) {
    
// Dias
    
$info['dias'] = ($diff - ($diff%86400))/86400;
    
$diff $diff%86400;
  }
  elseif(
$diff>3600) {
    
// Horas
    
$info['horas'] = ($diff - ($diff%3600))/3600;
    
$diff $diff%3600;
  }
  elseif(
$diff>60) {
    
// Minutos
    
$info['minutos'] = ($diff - ($diff%60))/60;
    
$diff $diff%60;
  }
  elseif(
$diff>0) {
  
// Segundos
    
$info['segundos'] = $diff;
  }
  
$f '';
  foreach(
$info as $k=>$v) {
    if(
$v>0$f .= "$v $k, ";
  }
  return 
substr($f,0,-2);
}
?>
para usarlo tienes que poner esto:
Código PHP:
<?php
$date 
"2009-4-02 11:16:30"// aca va la fecha de cuando se inserto los registros
$fecha preg_replace('/:[0-9][0-9][0-9]/','',$date);
$time strtotime($fecha);

echo 
"Hace ";
echo 
dateDiff($time,time());
?>
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:16.