3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?php function tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino){ $horaUTC = strtotime($hora); if($horaUTC >= strtotime($inicioMatutino) && $horaUTC < strtotime($finMatutino)) return "Matutino"; else if($horaUTC >= strtotime($finMatutino) && $horaUTC < strtotime($inicioVespertino) ) return "Descanso matutino"; else if($horaUTC >= strtotime($inicioVespertino) && $horaUTC < strtotime($finVespertino)) return "Vespertino"; else return "Descanso vespertino"; } function tipoCaso($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino){ $previoFinMatutino = date("H:i", strtotime($finMatutino . " -30 minutes")); $previoFinVespertino = date("H:i", strtotime($finVespertino . " -30 minutes")); //Si cayó el caso entre 14:30 y 15:00 o en Descanso matutino if( strtotime($hora) >= strtotime($previoFinMatutino) && strtotime($hora) < strtotime($finMatutino) || tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino) == "Descanso matutino" ){ $cadena = "Caso especial matutino"; //si cayó en un descanso matutino, es decir después las 15:00 y antes de las 16:30 se le sumará directo 30 if(tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino) == "Descanso matutino" ) $cadena = $cadena . " en descanso"; //los minutos sobrantes se suman despues de 16:30 return $cadena; } //Si cayó el caso entre las 18:00 y 18:30 o en descanso vespertino if( strtotime($hora) >= strtotime($previoFinVespertino) && strtotime($hora) < strtotime($finVespertino) || tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino) == "Descanso vespertino" ){ $cadena = "Caso especial vespertino"; if(tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino) == "Descanso vespertino") $cadena = $cadena . " en descanso"; //Los minutos sobrantes se suman después de 09:00 return $cadena; } //Si el caso entró dentro del rango matutino sin el caso especial, es normal matutino if( tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino) == "Matutino" ) return "Caso normal matutino"; //Si el caso entró dentro del rango vespertino sin el caso especial, es normal vespertino if( tipoHorario($hora, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino) == "Vespertino" ) return "Caso normal vespertino"; } function restaMinutos($horaMayor, $horaMenor){ $resultadoResta = strtotime($horaMayor) - strtotime($horaMenor); echo "Resultado resta $horaMayor - $horaMenor= ". date("i", $resultadoResta)."\n"; return date("i", $resultadoResta); } function minutosSobrantes($offset, $horaMayor, $horaMenor){ $horaMayor = date('H:i', strtotime($horaMayor ) ); $minMenor = restaMinutos($horaMayor, $horaMenor) ; //$resultadoResta = $offset - $minMenor; $minMayor = "00:".$offset.""; $resultadoResta = date("i", strtotime($minMayor. " -".$minMenor." minutes") ); echo "Minutos sobrantes: ". $resultadoResta."\n"; return $resultadoResta; } function obtenerHoraEstimada($hora, $tipoCaso, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino, $offset){ $horaEstimada = ""; //Si el tipo de caso es normal X //Solamente se le sumara el offset entero a la hora if( $tipoCaso == "Caso normal matutino" || $tipoCaso == "Caso normal vespertino" ){ echo "Se le sumará el offset entero ".$offset." a ".$hora."\n"; //echo "Hora estimada: " . date('H:i', strtotime($hora . " +30 minutes") ) . "\n"; $horaEstimada = date('H:i', strtotime($hora . " +30 minutes") ); } //sino, hay que ver que tipo de caso especial es else{ //Si es caso especial matutino, hay que calcular los minutos sobrantes y añadirlos a la hora //de inicio vespertina if( $tipoCaso == "Caso especial matutino" ){ echo "Se le sumará el sobrante de ".$offset." a la horaInicioVespertino: " . $inicioVespertino . "\n"; $sobrante= minutosSobrantes($offset, $finMatutino, $hora); //echo "Hora estimada: " . date("H:i", strtotime($inicioVespertino." +".$sobrante." minutes") ); $horaEstimada = date("H:i", strtotime($inicioVespertino." +".$sobrante." minutes") ); } //Si es caso especial matutino en descanso, hay que calcular los minutos sobrantes y añadirlos a la hora //de inicioVespertina else if( $tipoCaso == "Caso especial matutino en descanso" ){ echo "Se le sumará el offset entero ".$offset." a la horaInicioVespertino: " . $inicioVespertino . "\n"; //echo "Hora estimada: " . date('H:i', strtotime($inicioVespertino . " +30 minutes") ) . "\n"; $horaEstimada = date('H:i', strtotime($inicioVespertino . " +30 minutes") ); } //Si es caso especial vespertino, hay que calcular los minutos sobrantes y añadirlos a la hora //de inicioMatutina else if ($tipoCaso == "Caso especial vespertino" ){ echo "Se le sumará el sobrante de ".$offset." a la horaInicioMatutino: " . $inicioMatutino . "\n"; $sobrante = minutosSobrantes($offset, $finVespertino, $hora); //echo "Hora estimada: " . date("H:i", strtotime($inicioMatutino." +".$sobrante." minutes") ); $horaEstimada = date("H:i", strtotime($inicioMatutino." +".$sobrante." minutes") ); } //Si es caso especial vespertina en descanso, hay que calcular los minutos sobrantes y añadirlos a la hora //de inicioMatutina else if( $tipoCaso == "Caso especial vespertino en descanso" ){ echo "Se le sumará el offset entero ".$offset." a la horaInicioMatutino: " . $inicioMatutino . "\n"; //echo "Hora estimada: " . date('H:i', strtotime($inicioMatutino . " +30 minutes") ) . "\n"; $horaEstimada = date('H:i', strtotime($inicioMatutino . " +30 minutes") ) ; } } return $horaEstimada; } function obtenerFechaEstimada($fecha, $noDia){ $offsetFecha = ""; //Si el día de la fecha cayó entre lunes y jueves (inclusive domingo), aumentar 1 día if( ($noDia>= 1 && $noDia <= 4) || $noDia==7) $offsetFecha = " +1 days"; //Si cayó el viernes, aumentar 3 días else if( $noDia == 5 ) $offsetFecha = " +3 days"; //Si hubo el caso en el que cayó el sábado, aumentar 2 días else if( $noDia == 6 ) $offsetFecha = " +2 days"; return date("Y-m-d", strtotime($fecha . $offsetFecha) ); } function checktime($fechaHora, $minutosTolerancia){ $fecha = date("Y-m-d", strtotime($fechaHora)); $horaMinuto = date("H:i", strtotime($fechaHora)); $noDia = date("N", strtotime($fechaHora)); $horaInicioMatutino = "09:00"; $horaFinMatutino = "15:00"; $horaInicioVespertino = "16:30"; $horaFinVespertino = "18:30"; echo "fecha: " . $fecha . "\nhoraMinuto: " . $horaMinuto . "\nnoDia: " . $noDia . "\n\n"; echo "tipoHorario: " . tipoHorario($horaMinuto, $horaInicioMatutino, $horaInicioVespertino, $horaFinMatutino, $horaFinVespertino) . "\n\n"; echo "tipoCaso: " . tipoCaso($horaMinuto, $horaInicioMatutino, $horaInicioVespertino, $horaFinMatutino, $horaFinVespertino) . "\n\n"; $tipoCaso = tipoCaso($horaMinuto, $horaInicioMatutino, $horaInicioVespertino,$horaFinMatutino, $horaFinVespertino); $horaEstimada = obtenerHoraEstimada($horaMinuto, $tipoCaso, $horaInicioMatutino, $horaInicioVespertino, $horaFinMatutino, $horaFinVespertino, $minutosTolerancia ); $fechaEstimada = $fecha; if($tipoCaso == "Caso especial vespertino" || $tipoCaso == "Caso especial vespertino en descanso"){ $tempFechaEstimada = obtenerFechaEstimada($fecha, $noDia); //if lo del feriado $fechaEstimada = $tempFechaEstimada; } echo "Fecha estimada obtenida: " . $fechaEstimada."\n\n"; echo "Hora estimada obtenida: " . $horaEstimada."\n\n"; } checktime("2017-06-15 08:00:00",30); echo "***************************\n\n"; checktime("2017-06-15 09:00:00",30); echo "***************************\n\n"; checktime("2017-06-15 12:50:00",30); echo "***************************\n\n"; checktime("2017-06-15 14:29:00",30); echo "***************************\n\n"; checktime("2017-06-15 14:30:00",30); echo "***************************\n\n"; checktime("2017-06-15 14:35:00",30); echo "***************************\n\n"; checktime("2017-06-15 14:55:00",30); echo "***************************\n\n"; checktime("2017-06-15 16:29:00",30); echo "***************************\n\n"; checktime("2017-06-15 16:30:00",30); echo "***************************\n\n"; checktime("2017-06-15 17:59:00",30); echo "***************************\n\n"; checktime("2017-06-15 18:00:00",30); echo "***************************\n\n"; checktime("2017-06-15 18:29:00",30); echo "***************************\n\n"; checktime("2017-06-15 18:30:00",30); echo "***************************\n\n"; checktime("2017-06-15 19:29:00",30); echo "***************************\n\n"; ?>
based on jeFne
Output for 5.6.0 - 5.6.30, hhvm-3.15.4, 7.0.0 - 7.2.8
fecha: 2017-06-15 horaMinuto: 08:00 noDia: 4 tipoHorario: Descanso vespertino tipoCaso: Caso especial vespertino en descanso Se le sumará el offset entero 30 a la horaInicioMatutino: 09:00 Fecha estimada obtenida: 2017-06-16 Hora estimada obtenida: 09:30 *************************** fecha: 2017-06-15 horaMinuto: 09:00 noDia: 4 tipoHorario: Matutino tipoCaso: Caso normal matutino Se le sumará el offset entero 30 a 09:00 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 09:30 *************************** fecha: 2017-06-15 horaMinuto: 12:50 noDia: 4 tipoHorario: Matutino tipoCaso: Caso normal matutino Se le sumará el offset entero 30 a 12:50 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 13:20 *************************** fecha: 2017-06-15 horaMinuto: 14:29 noDia: 4 tipoHorario: Matutino tipoCaso: Caso normal matutino Se le sumará el offset entero 30 a 14:29 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 14:59 *************************** fecha: 2017-06-15 horaMinuto: 14:30 noDia: 4 tipoHorario: Matutino tipoCaso: Caso especial matutino Se le sumará el sobrante de 30 a la horaInicioVespertino: 16:30 Resultado resta 15:00 - 14:30= 30 Minutos sobrantes: 00 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 16:30 *************************** fecha: 2017-06-15 horaMinuto: 14:35 noDia: 4 tipoHorario: Matutino tipoCaso: Caso especial matutino Se le sumará el sobrante de 30 a la horaInicioVespertino: 16:30 Resultado resta 15:00 - 14:35= 25 Minutos sobrantes: 05 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 16:35 *************************** fecha: 2017-06-15 horaMinuto: 14:55 noDia: 4 tipoHorario: Matutino tipoCaso: Caso especial matutino Se le sumará el sobrante de 30 a la horaInicioVespertino: 16:30 Resultado resta 15:00 - 14:55= 05 Minutos sobrantes: 25 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 16:55 *************************** fecha: 2017-06-15 horaMinuto: 16:29 noDia: 4 tipoHorario: Descanso matutino tipoCaso: Caso especial matutino en descanso Se le sumará el offset entero 30 a la horaInicioVespertino: 16:30 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 17:00 *************************** fecha: 2017-06-15 horaMinuto: 16:30 noDia: 4 tipoHorario: Vespertino tipoCaso: Caso normal vespertino Se le sumará el offset entero 30 a 16:30 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 17:00 *************************** fecha: 2017-06-15 horaMinuto: 17:59 noDia: 4 tipoHorario: Vespertino tipoCaso: Caso normal vespertino Se le sumará el offset entero 30 a 17:59 Fecha estimada obtenida: 2017-06-15 Hora estimada obtenida: 18:29 *************************** fecha: 2017-06-15 horaMinuto: 18:00 noDia: 4 tipoHorario: Vespertino tipoCaso: Caso especial vespertino Se le sumará el sobrante de 30 a la horaInicioMatutino: 09:00 Resultado resta 18:30 - 18:00= 30 Minutos sobrantes: 00 Fecha estimada obtenida: 2017-06-16 Hora estimada obtenida: 09:00 *************************** fecha: 2017-06-15 horaMinuto: 18:29 noDia: 4 tipoHorario: Vespertino tipoCaso: Caso especial vespertino Se le sumará el sobrante de 30 a la horaInicioMatutino: 09:00 Resultado resta 18:30 - 18:29= 01 Minutos sobrantes: 29 Fecha estimada obtenida: 2017-06-16 Hora estimada obtenida: 09:29 *************************** fecha: 2017-06-15 horaMinuto: 18:30 noDia: 4 tipoHorario: Descanso vespertino tipoCaso: Caso especial vespertino en descanso Se le sumará el offset entero 30 a la horaInicioMatutino: 09:00 Fecha estimada obtenida: 2017-06-16 Hora estimada obtenida: 09:30 *************************** fecha: 2017-06-15 horaMinuto: 19:29 noDia: 4 tipoHorario: Descanso vespertino tipoCaso: Caso especial vespertino en descanso Se le sumará el offset entero 30 a la horaInicioMatutino: 09:00 Fecha estimada obtenida: 2017-06-16 Hora estimada obtenida: 09:30 ***************************