Ver Mensaje Individual
  #7 (permalink)  
Antiguo 09/04/2017, 10:10
oggy_15_3
 
Fecha de Ingreso: marzo-2015
Mensajes: 183
Antigüedad: 9 años, 7 meses
Puntos: 8
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

Hola comunidad.
Creo que no me dejaba entender bien.

Pero ya tengo el script terminado.. al menos con todas las pruebas hechas hasta ahora me está funcionando.

Código PHP:
Ver original
  1. function convertHourToSeconds($sHour){
  2.     $sHour = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $sHour);
  3.     sscanf($sHour, "%d:%d:%d", $hours, $minutes, $seconds);
  4.     $time_seconds = $hours * 3600 + $minutes * 60 + $seconds;
  5.     //echo "<br/>".$sHour."->".$time_seconds;
  6.     return $time_seconds;
  7. }
  8.  
  9. function fnValidarDiaSemana($sFechaAct="",$sDiaHoraIni="",$sDiaHoraFin=""){
  10.  $nSecondAct=strtotime($sFechaAct);
  11.  $sHoraAct=date("h:i:s",$nSecondAct);
  12.  $nDiaSemAct=date("N",$nSecondAct);
  13.  //echo $nSecondAct."->".$sHoraAct." - ".$nDiaSemAct;
  14.  
  15.  $sINIEJE=$sDiaHoraIni;
  16.  $sFINEJE=$sDiaHoraFin;
  17.  
  18.  $aINIEJE=explode(" ",$sINIEJE);
  19.  $nDiaSemIni=$aINIEJE[0];
  20.  $sHoraIni=$aINIEJE[1];
  21.  
  22.  $aFINEJE=explode(" ",$sFINEJE);
  23.  $nDiaSemFin=$aFINEJE[0];
  24.  $sHoraFin=$aFINEJE[1];
  25.  
  26.  $nPermAcc=0 ;
  27.  if($nDiaSemAct >= $nDiaSemIni and $nDiaSemAct <= $nDiaSemFin )
  28.     $nPermAcc=1;
  29.  
  30.  else if($nDiaSemIni > $nDiaSemFin and ( $nDiaSemFin >= $nDiaSemAct or $nDiaSemFin == $nDiaSemAct or $nDiaSemAct = $nDiaSemIni ))    
  31.     $nPermAcc=1;
  32.  else
  33.     $nPermAcc=0;
  34.  
  35.  
  36.  $sFechaFin='';
  37.  $nSecondFin=0;
  38.  $sEstadoFecha='V';
  39.  //1 10:06:00-5 05:00:00
  40.  if($nDiaSemIni <= $nDiaSemFin){
  41.     $nSHACT=convertHourToSeconds($sHoraAct);
  42.     $nSHINI=convertHourToSeconds($sHoraIni);
  43.     $nSHFIN=convertHourToSeconds($sHoraFin);
  44.    
  45.     $nDif=$nDiaSemFin - $nDiaSemAct;//5-1
  46.     if($nDiaSemAct == $nDiaSemIni and $nSHINI >= $nSHACT){
  47.       $sEstadoFecha='X';
  48.       if($nSHINI==$nSHACT) $sEstadoFecha='V';
  49.       $nDif=0;
  50.       $sHoraFin=$sHoraIni;
  51.     }
  52.     $nSecondFin = $nSecondAct + ($nDif * 24 * 60 * 60);
  53.  }else{
  54.     //3 10:06:00-5 05:00:00
  55.     $nSHACT=convertHourToSeconds($sHoraAct);
  56.     $nSHINI=convertHourToSeconds($sHoraIni);
  57.     $nSHFIN=convertHourToSeconds($sHoraFin);
  58.    
  59.     $nDif=$nDiaSemFin - $nDiaSemAct;
  60.     $nDif($nDif<0?7-$nDif:$nDif);
  61.  
  62.     if($nDiaSemAct == $nDiaSemIni and $nSHINI >= $nSHACT){
  63.       $sParamFinal='X';
  64.       if($nSHINI==$nSHACT) $sEstadoFecha='V';
  65.       $nDif=0;
  66.       $sHoraFin=$sHoraIni;
  67.     }
  68.     $nSecondFin = $nSecondAct + ($nDif * 24 * 60 * 60);
  69.  }
  70.  
  71.  $sFechaFin=date("Y-m-d",$nSecondFin)." ".$sHoraFin;
  72.  $nSecondFin=strtotime($sFechaFin);
  73.  
  74.  if(($nSecondAct <= $nSecondFin and $nPermAcc == 1) and $sEstadoFecha <>'X')
  75.    return 1
  76.  else
  77.    return 0
  78.  
  79. }
  80.  
  81. echo fnValidarDiaSemana('2017-04-10 10:05:00','3 10:06:00','5 15:00:00');#0 (invalido)
  82. echo "<br>";
  83. echo fnValidarDiaSemana('2017-04-10 10:05:00','1 10:03:00','5 15:00:00');#1 (valido)

Como dije en un inicio. El único parámetro considerado fecha es el primer parámetro de la función, el 2do y 3er parámetro son en número de día de la semana y la hora.

Quizás haya otra manera más resumida de hacerlo, pero lo hice de esta manera ya que más adelante lo usaré para un script en bash.

Saludos.