<?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";
?>
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
***************************
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
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
***************************
Output for 7.3.32 - 7.3.33, 7.4.26, 8.0.13
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 00: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 00: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 00: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
***************************