<?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";
?>
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).