Foros del Web » Programando para Internet » PHP »

Problema restar dos tiempos

Estas en el tema de Problema restar dos tiempos en el foro de PHP en Foros del Web. Buenas, Estoy haciendo una función similar a la que utiliza facebook que te dice cuanto tiempo ha pasado desde que se puso un comentario, por ...
  #1 (permalink)  
Antiguo 27/02/2010, 18:13
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Problema restar dos tiempos

Buenas,

Estoy haciendo una función similar a la que utiliza facebook que te dice cuanto tiempo ha pasado desde que se puso un comentario, por ej.

Y tengo problemas cuando las horas son del estilo
hora comentario = 22:00
hora actual = 1:30

La diferencia debería ser de 3 horas y 30 min. Sin embargo me aparece
Hace -1230 minutos xD

Código PHP:
Ver original
  1. function calcular_tiempo_trasnc($hora1,$hora2){
  2. // HORA1 = HORA ACTUAL
  3. // HORA2 = OTRA HORA
  4.  
  5.     $separar[1]=explode(':',$hora1);
  6.     $separar[2]=explode(':',$hora2);
  7.  
  8. // Transformo las hora 0:00 en las 24:00
  9. if ($separar[1][0]==0) $separar[1][0]=24;
  10. if ($separar[2][0]==0) $separar[2][0]=24;
  11.  
  12. $total_minutos_trasncurridos[1] = ($separar[1][0]*60)+$separar[1][1];
  13. $total_minutos_trasncurridos[2] = ($separar[2][0]*60)+$separar[2][1];
  14. $total_minutos_trasncurridos = $total_minutos_trasncurridos[1]-$total_minutos_trasncurridos[2];
  15.  
  16. if(($total_minutos_trasncurridos<=59) and ($total_minutos_trasncurridos>=0))
  17.     return('Hace '.$total_minutos_trasncurridos.' minutos');
  18. elseif ($total_minutos_trasncurridos<0)
  19.     return('Hace '.$total_minutos_trasncurridos.' minutos');
  20.  
  21. elseif($total_minutos_trasncurridos>59){
  22.  
  23.     $HORA_TRANSCURRIDA = round($total_minutos_trasncurridos/60);
  24.    
  25.     if($HORA_TRANSCURRIDA==1) $texthora='hora';
  26.     else $texthora='horas';
  27.    
  28.     $MINUITOS_TRANSCURRIDOS = $total_minutos_trasncurridos%60;
  29.    
  30.     return ('Hace '.$HORA_TRANSCURRIDA." $texthora y ".$MINUITOS_TRANSCURRIDOS.' minutos');
  31. }
  32.  
  33. }
  34. //llamamos la función e imprimimos
  35. echo "<br/>";
  36. echo date('H:i');
  37. echo "<br/>";
  38. echo calcular_tiempo_trasnc('22:29','22:20'); // Hace 9 minutos
  39. echo "<br/>";
  40. echo calcular_tiempo_trasnc('23:34','22:20'); // Hace 1 hora y 14 minutos
  41. echo "<br/>";
  42. echo calcular_tiempo_trasnc('1:30','22:00'); // Hace -1230 minutos
  43. echo "<br/>";

¿Qué modificaríais?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 27/02/2010, 18:26
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Problema restar dos tiempos

En esa funcion envias 2 horas, pero...... ¿y si son de un dia distinto? Yo te aconsejo que en vez de guardar en bases de datos la fecha y hora tal que "1-1-2010 15:30" o "15:30", grabes directamente el valor de time() que es una cifra entera que corresponde a segundos transcurridos desde X fecha.

Con dicha cifra puedes controlar todo mucho mejor, prueba a hacer echo time(); Si eso lo grabas en la base de datos luego comparas el time() actual con el time() grabado y ahi tienes la diferencia en segundos, que con ciertas funciones lo puedes convertir a algo tal que "hace 15 minutos" o "hace 9 horas y 5 minutos" o "hace mas de 3 dias" etc
  #3 (permalink)  
Antiguo 28/02/2010, 08:37
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Problema restar dos tiempos

Lo conseguí hacer de la siguiente manera.

Código PHP:
Ver original
  1. function date_diff($d1, $d2){
  2. // Compara dos timestamps y retorna el array con las diferencias (year, month, day, hour, minute, second)
  3.  
  4.   //comprueba la mayor marca de tiempo y la cambia si es necesario
  5.   if ($d1 < $d2){
  6.     $temp = $d2;
  7.     $d2 = $d1;
  8.     $d1 = $temp;
  9.   }
  10.   else {
  11.     $temp = $d1; //temp puede ser usado para el recuento de días si es necesario
  12.   }
  13.   $d1 = date_parse(date("Y-m-d H:i:s",$d1));
  14.   $d2 = date_parse(date("Y-m-d H:i:s",$d2));
  15.   //seconds
  16.   if ($d1['second'] >= $d2['second']){
  17.     $diff['second'] = $d1['second'] - $d2['second'];
  18.   }
  19.   else {
  20.     $d1['minute']--;
  21.     $diff['second'] = 60-$d2['second']+$d1['second'];
  22.   }
  23.   //minutes
  24.   if ($d1['minute'] >= $d2['minute']){
  25.     $diff['minute'] = $d1['minute'] - $d2['minute'];
  26.   }
  27.   else {
  28.     $d1['hour']--;
  29.     $diff['minute'] = 60-$d2['minute']+$d1['minute'];
  30.   }
  31.   //hours
  32.   if ($d1['hour'] >= $d2['hour']){
  33.     $diff['hour'] = $d1['hour'] - $d2['hour'];
  34.   }
  35.   else {
  36.     $d1['day']--;
  37.     $diff['hour'] = 24-$d2['hour']+$d1['hour'];
  38.   }
  39.   //days
  40.   if ($d1['day'] >= $d2['day']){
  41.     $diff['day'] = $d1['day'] - $d2['day'];
  42.   }
  43.   else {
  44.     $d1['month']--;
  45.     $diff['day'] = date("t",$temp)-$d2['day']+$d1['day'];
  46.   }
  47.   //months
  48.   if ($d1['month'] >= $d2['month']){
  49.     $diff['month'] = $d1['month'] - $d2['month'];
  50.   }
  51.   else {
  52.     $d1['year']--;
  53.     $diff['month'] = 12-$d2['month']+$d1['month'];
  54.   }
  55.   //years
  56.   $diff['year'] = $d1['year'] - $d2['year'];
  57.   return $diff;
  58.   //print_r($date_diff_array);
  59. }
  60.  
  61. function mostrar_date_diff($d1, $d2){
  62.     // Muestra el tiempo que ha pasado entre dos horas. Ej. Hace 2 horas
  63.     $date_diff_array = date_diff($d1, $d2);
  64.  
  65.     if ($date_diff_array['year']!=0){
  66.         if ($date_diff_array['year']==1) echo "Hace ".$date_diff_array['year']." año";
  67.         else echo "Hace ".$date_diff_array['year']." años";
  68.     }elseif ($date_diff_array['month']!=0){
  69.         if ($date_diff_array['month']==1) echo "Hace ".$date_diff_array['month']." mes";
  70.         else echo "Hace ".$date_diff_array['month']." meses";
  71.     }elseif ($date_diff_array['day']!=0){
  72.         if ($date_diff_array['day']==1) echo "Hace ".$date_diff_array['day']." dia";
  73.         else echo "Hace ".$date_diff_array['day']." dias";
  74.     }elseif ($date_diff_array['hour']!=0){
  75.         if ($date_diff_array['hour']==1) echo "Hace ".$date_diff_array['hour']." hora";
  76.         else echo "Hace ".$date_diff_array['hour']." horas";
  77.     }elseif ($date_diff_array['minute']!=0){
  78.         if ($date_diff_array['minute']==1) echo "Hace ".$date_diff_array['minute']." minuto";
  79.         else echo "Hace ".$date_diff_array['minute']." minutos";
  80.     }elseif ($date_diff_array['second']!=0){
  81.         if ($date_diff_array['second']==1) echo "Hace ".$date_diff_array['second']." segundo";
  82.         else echo "Hace ".$date_diff_array['second']." segundos";
  83.     }
  84. }
  85. // LLAMADA
  86. $fecha_modificada = strtotime("2010-02-28 13:11:00");
  87. mostrar_date_diff($fecha_modificada, time());

Lo único es que los tiempos de facebook se van actualizando solos sin recargar la página! no se como lograrlo, imagino que hace o bien una consulta en ajax o en javascript... que creéis?

Alguien mostrarme un ejemplo?

Salu2!

Etiquetas: dos, restar
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:52.