entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

restar horas en php

Hola chic@s tengo un pequeño problema que aun no consigo resolver estoy intentado hacer una resta de horas en PHP por ejemplo 81:30:00 restarle 50:00:00 y que me de como resultado 31:30:00 este es el punto que quiero resolver.
He estado utilizando date_diff pero solo funciona con menor de 24 horas y ahora tengo este otro ejemplo

$hora1 = "23:00:00";
$hora2 = "05:00:00";
$datex7 = new DateTime($hora2);
$datex77 = new DateTime($hora1);
$horax7 = date_diff($datex7, $datex77);
echo $hx7x7 = $horax7->format('%H:%i:%s'); 
y da como resultado 18:00:00//hasta aquí funciona

pero si quiero utilizar el mismo código con mas de 24 horas no funciona

$hora1 = "50:00:00";
$hora2 = "05:00:00";
$datex7 = new DateTime($hora2);
$datex77 = new DateTime($hora1);
$horax7 = date_diff($datex7, $datex77);
echo $hx7x7 = $horax7->format('%H:%i:%s');
//me ocurre este error
Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string

si alguien conoce una solución se le agradecería mucho
de antemano gracias por su atención

2 Respuestas

1voto

jj19958 Puntos4130

lo resolví de la siguiente manera que me da el resultado obtenido :)
gracias por todo :)

//aquí la $h50[$em22][41] almacena el la hora que queremos restar :)
$date7 = $h50[$em22][41];
$hentrada7= DateTime::createFromFormat('H:i:s', $date7)->format('H:00:00');
$hentrada7;
$seconds7 = Strtotime($hentrada7);
$round7 = round($seconds7/3600)*3600;
$hentrada77 = date('H:i:00',$round7);
$hentrada77;
 //aquí convertimos la hora de salida que son el total de horas :)
//$hotal[$em22][10] almacena el total de horas :)
$date77 = $hotal[$em22][10];
$hsalida77 = DateTime::createFromFormat('H:i:s',$date77)->format('H:00:00');
$hsalida77;
$htotal7 = $hsalida77 - $hentrada77;
$datex7 = new DateTime($hentrada77);
$datex77 = new DateTime($hsalida77);
$horax7 = date_diff($datex7, $datex77);
//aquí obtenemos el total y le damos formato de hora :)
echo $h99 = $horax7->format('%H');
//aqui obtenemos el resutado 05,06,02,01,11,12 etc... que es lo resultado esperado :)

0voto

Peter comentado

Gracias por compartir la solución! :D

2votos

magarzon Puntos30650

Hola.

En primer lugar, te da error por la clase DateTime, por defecto, espera unos formatos específicos por defecto con unos valores "válidos". 50 para DateTime no es un valor válido, para los formatos por defecto.

Lo que tienes que hacer es decirle qué formato estás usando. Esto funcionaría:

$hora1 = '50:00:00';
$hora2 = '05:00:00';
$datex7 = DateTime::createFromFormat('H:i:s', $hora2);
$datex77 = DateTime::createFromFormat('H:i:s', $hora1);
$horax7 = date_diff($datex7, $datex77);

Pero ahora vamos a la segunda parte. Como estás estableciendo horas "raras", esa diferencia son 45 horas, pero el objecto DateInterval que te proporciona el date_diff, que tiene campos para años, meses, días, horas, minutos, segundos, etc., es "inteligente", y no te va a poner 45 en el campo de horas, si no 1 en el campo días y 21 en el campo horas, por lo que la llamada a format con el formato que tú tienes te va a dar 21:0:0 (que no es correcto).

Tendrías que hacer algo así para obtener lo que tú quieres:

$h1 =intval($horax7->format('%d'));
$h2 =intval($horax7->format('%h'));
$horas = $h1*24+$h2;
echo "$horas:{$horax7->format('%m:%i')}";

Teniendo en cuenta que puedes tener el mismo problema si los minutos y/o segundos también pueden ser más de 60 (tendrías que hacer lo mismo que he hecho con las horas).

1voto

jj19958 comentado

Lo que pasa es lo siguiente como hago la suma de horas trabajadas de una semana puede variar lo tengo bien pero ahora quiero hacer una resta para saber las horas extras etc... y pues como datos solo tengo el total de horas...

De antemano gracias por tu información.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta