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 minutosDiferencia($horaMayor, $horaMenor){ $resultadoResta = strtotime($horaMayor) - strtotime($horaMenor); echo "Resultado resta ". date("H:i", $resultadoResta)."\n"; } function agregarOffsetHora($hora, $tipoCaso, $inicioMatutino, $inicioVespertino, $finMatutino, $finVespertino, $offset){ //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 ".$offset." a ".$hora."\n"; echo "Hora estimada: " . date('H:i', strtotime($hora . " +30 minutes") ) . "\n"; } //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"; minutosDiferencia($finMatutino, $hora); } //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"; } //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"; minutosDiferencia($finVespertino, $hora); } //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"; } } } 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); agregarOffsetHora($horaMinuto, $tipoCaso, $horaInicioMatutino, $horaInicioVespertino, $horaFinMatutino, $horaFinVespertino, $minutosTolerancia ); echo "\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 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 QuLff
Output for 5.6.0 - 5.6.30, hhvm-3.15.4, 7.0.0 - 7.3.0rc3
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 Hora estimada: 09:30 *************************** fecha: 2017-06-15 horaMinuto: 09:00 noDia: 4 tipoHorario: Matutino tipoCaso: Caso normal matutino Se le sumará el offset 30 a 09:00 Hora estimada: 09:30 *************************** fecha: 2017-06-15 horaMinuto: 12:50 noDia: 4 tipoHorario: Matutino tipoCaso: Caso normal matutino Se le sumará el offset 30 a 12:50 Hora estimada: 13:20 *************************** fecha: 2017-06-15 horaMinuto: 14:29 noDia: 4 tipoHorario: Matutino tipoCaso: Caso normal matutino Se le sumará el offset 30 a 14:29 Hora estimada: 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 01:30 *************************** 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 Hora estimada: 17:00 *************************** fecha: 2017-06-15 horaMinuto: 16:30 noDia: 4 tipoHorario: Vespertino tipoCaso: Caso normal vespertino Se le sumará el offset 30 a 16:30 Hora estimada: 17:00 *************************** fecha: 2017-06-15 horaMinuto: 17:59 noDia: 4 tipoHorario: Vespertino tipoCaso: Caso normal vespertino Se le sumará el offset 30 a 17:59 Hora estimada: 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 01:30 *************************** 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 01:01 *************************** 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 Hora estimada: 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 Hora estimada: 09:30 ***************************