Foros del Web » Programando para Internet » PHP »

[APORTE] Sumar y restar horas

Estas en el tema de [APORTE] Sumar y restar horas en el foro de PHP en Foros del Web. Compañeros a continuación dejo las funciones para sumar y restar horas en PHP. La verdad que busqué y busqué en la web (e incluso aquí ...
  #1 (permalink)  
Antiguo 31/03/2010, 18:53
Avatar de De_la_Cuesta_13  
Fecha de Ingreso: abril-2009
Ubicación: Cali, Colombia.
Mensajes: 265
Antigüedad: 15 años, 7 meses
Puntos: 14
[APORTE] Sumar y restar horas

Compañeros a continuación dejo las funciones para sumar y restar horas en PHP. La verdad que busqué y busqué en la web (e incluso aquí en foros del web), pero encontraba aproximaciones de lo que realmente esperaba, es decir, funcionan hasta cierto punto las funciones, pero si cambias unas cositas: dejan de funcionar o muestran errores.

NOTA: Aclarar que la matemática para la suma y resta de horas la saque de http://www.aaamatematicas.com/. Así que lo que hice fue pasar eso a PHP y adicionar/mejorar ciertos aspectos que ellos no mencionan y que son muy importantes.

Restar Horas
funct_restar_horas.php -> Será el nombre del archivo que incluirá la función.
Código PHP:
    /*
     * Original de: http://www.aaamatematicas.com/subtsbhm.htm     
     */

    ##Función que resta horas
    
function restar_horas ($hora1,$hora2){
    
    
$temp1 explode(":",$hora1);
    
$temp_h1 = (int)$temp1[0];
    
$temp_m1 = (int)$temp1[1];
    
$temp_s1 = (int)$temp1[2];
    
$temp2 explode(":",$hora2);
    
$temp_h2 = (int)$temp2[0];
    
$temp_m2 = (int)$temp2[1];
    
$temp_s2 = (int)$temp2[2];
    
    
// si $hora2 es mayor que la $hora1, invierto
    
if( $temp_h1 $temp_h2 ){
        
$temp  $hora1;
        
$hora1 $hora2;
        
$hora2 $temp;
    }
    
/* si $hora2 es igual $hora1 y los minutos de
       $hora2 son mayor que los de $hora1, invierto*/
    
elseif( $temp_h1 == $temp_h2 && $temp_m1 $temp_m2){
        
$temp  $hora1;
        
$hora1 $hora2;
        
$hora2 $temp;
    }
    
/* horas y minutos iguales, si los segundos de 
       $hora2 son mayores que los de $hora1,invierto*/
    
elseif( $temp_h1 == $temp_h2 && $temp_m1 == $temp_m2 && $temp_s1 $temp_s2){
        
$temp  $hora1;
        
$hora1 $hora2;
        
$hora2 $temp;
    }    
    
    
$hora1=explode(":",$hora1);
    
$hora2=explode(":",$hora2);
    
$temp_horas 0;
    
$temp_minutos 0;        
    
    
//resto segundos
    
$segundos;
    if( (int)
$hora1[2] < (int)$hora2[2] ){
        
$temp_minutos = -1;        
        
$segundos = ( (int)$hora1[2] + 60 ) - (int)$hora2[2];
    }
    else    
        
$segundos = (int)$hora1[2] - (int)$hora2[2];
        
    
//resto minutos
    
$minutos;
    if( (int)
$hora1[1] < (int)$hora2[1] ){
        
$temp_horas = -1;        
        
$minutos = ( (int)$hora1[1] + 60 ) - (int)$hora2[1] + $temp_minutos;
    }    
    else
        
$minutos =  (int)$hora1[1] - (int)$hora2[1] + $temp_minutos;
        
    
//resto horas    
    
$horas = (int)$hora1[0]  - (int)$hora2[0] + $temp_horas;
        
    if(
$horas<10)
        
$horas'0'.$horas;
    
    if(
$minutos<10)
        
$minutos'0'.$minutos;
    
    if(
$segundos<10)
        
$segundos'0'.$segundos;
        
    
$rst_hrs $horas.':'.$minutos.':'.$segundos;    

    return (
$rst_hrs);    
    
    } 
Su uso
restar_horas.php -> Será el fichero que usaremos como demo.
Código PHP:
include("funct_restar_horas.php");
//restar horas, minutos y segundos
echo restar_horas("12:35:41","10:37:53").'<br/>';
echo 
restar_horas("10:37:53","12:35:41").'<br/>';
//restar horas y minutos -> no es necesario ingresar
echo restar_horas("08:15","12:45").'<br/>';
echo 
restar_horas("12:45","08:15").'<br/>';
# No es necesario ingresar en orden las fechas, el script se encarga de ello. :) 
Sumar Horas
funct_suma_horas.php -> Será el fichero que incluirá la función.
Código PHP:
    /*
     * Original de: http://www.aaamatematicas.com/addthrpm.htm     
     */
     
    ##Función que suma horas
    
function suma_horas ($hora1,$hora2){

    
$hora1=explode(":",$hora1);
    
$hora2=explode(":",$hora2);
    
$temp=0;
    
    
//sumo segundos
    
$segundos=(int)$hora1[2]+(int)$hora2[2];
    while(
$segundos>=60){        
        
$segundos=$segundos-60;
        
$temp++;
    }
        
    
//sumo minutos
    
$minutos=(int)$hora1[1]+(int)$hora2[1]+$temp;
    
$temp=0;
    while(
$minutos>=60){        
        
$minutos=$minutos-60;
        
$temp++;
    }
    
    
//sumo horas
    
$horas=(int)$hora1[0]+(int)$hora2[0]+$temp;
    
    if(
$horas<10)
        
$horas'0'.$horas;
    
    if(
$minutos<10)
        
$minutos'0'.$minutos;
    
    if(
$segundos<10)
        
$segundos'0'.$segundos;
        
    
$sum_hrs $horas.':'.$minutos.':'.$segundos;
    
    return (
$sum_hrs);     
    
    } 
Su uso
sumar_horas.php -> Fichero demo.
Código PHP:
include("funct_suma_horas.php");
echo 
suma_horas("08:15","12:45").'<br/>';
echo 
suma_horas("18:15:17","06:45:48").'<br/>'
Eso ha sido todo compañeros, espero comentarios.

Saludos,

De la Cuesta.
__________________
Sólo quien nunca nada hace, nunca se equivoca.
  #2 (permalink)  
Antiguo 31/03/2010, 19:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: [APORTE] Sumar y restar horas

Gracias por el aporte. Pero un consejo siempre es bueno trabajar con las funciones de date/time. Por ejemplo
Código PHP:
Ver original
  1. $resta = strtotime("12:35:41") - strtotime("10:37:53");
  2. echo date("h:i:s", $resta). "<br />"; //01:57:48
Hace exactamente lo que hiciste. La de suma es un poco más complicado pero con las funciones de date/time podrás lograrlo.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 31/03/2010, 19:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: [APORTE] Sumar y restar horas

También que la clase DateTime tiene un método para sumar o restar fechas.

Saludos.
  #4 (permalink)  
Antiguo 31/03/2010, 19:28
Avatar de De_la_Cuesta_13  
Fecha de Ingreso: abril-2009
Ubicación: Cali, Colombia.
Mensajes: 265
Antigüedad: 15 años, 7 meses
Puntos: 14
Respuesta: [APORTE] Sumar y restar horas

Es correcto lo que mencionan ,es más debería hacerse así, pero con esas funciones PHP sólo reconoce hasta las 23:59:59, por lo tanto, si necesitas sumar más de 24:00:00 no funcionaría. Lo digo porque estoy trabajando con un acumulado de horas y si lo haga así no funcionaría, por ello la única forma es con esas funciones.
__________________
Sólo quien nunca nada hace, nunca se equivoca.
  #5 (permalink)  
Antiguo 31/03/2010, 19:31
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: [APORTE] Sumar y restar horas

Es verdad lo que dices, pero tal vez disminuyas más código si usas la clase que te indico GatorV o la de Date/Time. Echale un ojo para que entonces optimises lo que hiciste.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 15/09/2010, 18:52
Avatar de egepe  
Fecha de Ingreso: diciembre-2009
Mensajes: 310
Antigüedad: 14 años, 11 meses
Puntos: 7
Respuesta: [APORTE] Sumar y restar horas

Me parece muy bien tu aporte DE_LA_CUESTA, no he probando la condicion que dices luego de 23:59:59 para ver como funciona... Esta muy bueno.

Ahora yo he utilizado DateTime que te comento GatorV y funciona muy bien, si embargo, te reitero que me parece muy bien tu aporte xq me recuerda q muchas veces investigar y sacar resultados como el tuyo...

Saludos...

Etiquetas: horas, restar, aportes
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 04:22.