Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Comprobar si fecha y hora cumple se encuentra en rango de semanas

Estas en el tema de Comprobar si fecha y hora cumple se encuentra en rango de semanas en el foro de PHP en Foros del Web. Hola comunidad. Llevo 2 días intentando encontrar la manera de como hacer que mi script detecte si una determinada fecha y hora se encuentra dentro ...
  #1 (permalink)  
Antiguo 05/04/2017, 22:28
 
Fecha de Ingreso: marzo-2015
Mensajes: 183
Antigüedad: 9 años, 7 meses
Puntos: 8
Comprobar si fecha y hora cumple se encuentra en rango de semanas

Hola comunidad.

Llevo 2 días intentando encontrar la manera de como hacer que mi script detecte si una determinada fecha y hora se encuentra dentro de 2 determinados valores que son
dias de semana y sus respectivas horas.

Donde: 0=Domingo,1=Lunes,.....6=Sabado
EJM 1:
fecha consultada: 2017-04-05 03:15:00
primer dia semana: 0->20:10:00
segundo dia semana: 3->03:16:00

Resultado: Si cumple. La fecha consultada si esta dentro de los dias de semana 0,1,2,(3) y ademas el dia 3 con hora 03:16:00 es mayor e igual al dia de semana 3 con hora 03:15:00

EJM 2:
fecha consultada: 2017-04-05 03:15:00
primer dia semana: 5->20:10:00
segundo dia semana: 4->03:15:00

Resultado: Si cumple. La fecha consultada si esta dentro de los dias de semana ingresados ya que 2017-04-05 tiene el dia de semana 3 y ademas esta dentro de los dias 5,6,0,1,2,(3),4; además el dia de semana 4 con hora 03:15:00 es mayor al dia de semana 3 con hora 03:15:00


EJM 3:
fecha consultada: 2017-04-05 03:15:00
primer dia semana: 5->20:10:00
segundo dia semana: 2->03:15:00

Resultado: No cumple. La fecha consultada no esta dentro de los dias de semana 5,6,0,1,2;

Espero dejarme entender.
Agradezco su interés por este tema.

Saludos.
  #2 (permalink)  
Antiguo 06/04/2017, 07:58
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 8 meses
Puntos: 1146
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

No realizamos trabajos escolares, por favor regresa y acude con tu profesor.
  #3 (permalink)  
Antiguo 06/04/2017, 08:31
 
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

Cita:
Iniciado por ArturoGallegos Ver Mensaje
No realizamos trabajos escolares, por favor regresa y acude con tu profesor.
Tarea?. Ah ok, señor "experimentado". Me imagino que para algunos puede parecer simple, lo cuál lo aplaudo, pero para algunos no.

  #4 (permalink)  
Antiguo 06/04/2017, 09:53
 
Fecha de Ingreso: abril-2015
Ubicación: Murcia
Mensajes: 12
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

Hola normalmente para trabajar con fechas en php y hacer comparaciones, condiciones etc se suele utilizar strtotime() para convertir la fecha en un numero entero y de esa manera es mas fácil hacer las condiciones.

Por ejemplo si quieres saber si 2017-04-05 03:15:00 ya se a cumplido comparando con la fecha actual tendrías que hacer algo así:

Código PHP:
<?php 
if(strtotime('2017-04-05 03:15:00') < time()){
    echo 
'Esta fecha esta cumplida';
}
?>
o si quieres comparar dos fechas así:

Código PHP:
<?php 
if( strtotime('2017-04-10 03:15:00') < strtotime('2017-01-01 03:15:00') ){
    echo 
'Esta fecha NO esta cumplida';
}
?>
te dejo un enlace a la web oficial [URL="http://php.net/manual/es/function.strtotime.php"]http://php.net/manual/es/function.strtotime.php[/URL]

salu2
  #5 (permalink)  
Antiguo 06/04/2017, 10:07
 
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

Cita:
Iniciado por codzeus Ver Mensaje
Hola normalmente para trabajar con fechas en php y hacer comparaciones, condiciones etc se suele utilizar strtotime() para convertir la fecha en un numero entero y de esa manera es mas fácil hacer las condiciones.

Por ejemplo si quieres saber si 2017-04-05 03:15:00 ya se a cumplido comparando con la fecha actual tendrías que hacer algo así:

Código PHP:
<?php 
if(strtotime('2017-04-05 03:15:00') < time()){
    echo 
'Esta fecha esta cumplida';
}
?>
o si quieres comparar dos fechas así:

Código PHP:
<?php 
if( strtotime('2017-04-10 03:15:00') < strtotime('2017-01-01 03:15:00') ){
    echo 
'Esta fecha NO esta cumplida';
}
?>
te dejo un enlace a la web oficial [URL="http://php.net/manual/es/function.strtotime.php"]http://php.net/manual/es/function.strtotime.php[/URL]

salu2
Hola.
Lo que pasa es que el primer parametro que utilizo si es una fecha ya que tiene el la fecha y la hora, pero el 2do parametro y el 3ro no son fechas netamente sólo me dan el numero de dia de la semana y las horas.
EJM:
'2017-04-06 11:00:00','6 15:00:00','4 12:00:00'

Si no me equivoco el strtotime trabaja con fechas completas no con valores en las que se muestra solo la hora y el numero de dia de la semana.


Gracias de todas maneras.
Estoy cerca de resolver este problema
  #6 (permalink)  
Antiguo 06/04/2017, 12:54
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

Utiliza DateTime o la función date()

Por que no determinas primero el día de la semana que le corresponde a la fecha. Una vez que tienes igualados los 3 elementos, aplicas comparaciones.

Si esperas que de verdad alguien te ayude, deberías empezar por mostrar el código que tienes.
__________________
Unset($vida['malRollo']);
  #7 (permalink)  
Antiguo 09/04/2017, 10:10
 
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.
  #8 (permalink)  
Antiguo 09/04/2017, 12:18
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

Demasiado rollo solo para comparar si una fecha esta entre x días y horas de la semana

Código PHP:
<?php
function comprobar ($fecha$min$max)
{
    
$fecha date("N H:i:s"strtotime$fecha ) );
    
$arrayDel = array (' '':' );
    
$fechaTemp str_replace($arrayDel""$fecha );
    
$fechaMin str_replace($arrayDel""$min );
    
$fechaMax str_replace($arrayDel""$max );

    if ( 
$fechaMin  <= $fechaTemp AND $fechaMax >= $fechaTemp 
    { 
        echo 
'valida';
    }
    else
    { 
        echo 
'invalida';
    }


comprobar('2017-04-06 11:00:00','6 15:00:00','4 12:00:00');
echo 
'<br>';

comprobar('2017-04-10 10:05:00','1 10:03:00','5 15:00:00');
echo 
'<br>';
Así conseguimos el mismo resultado en apenas 20 líneas.
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 09/04/2017 a las 12:33
  #9 (permalink)  
Antiguo 09/04/2017, 12:39
 
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

Cita:
Iniciado por xerifandtomas Ver Mensaje
Demasiado rollo solo para comarca si una fecha esta entre x días y horas de la semana

Código PHP:
<?php
function comprobar ($fecha$min$max)
{
    
$fecha date("N H:i:s"strtotime$fecha ) );
    
$arrayDel = array (' '':' );
    
$fechaTemp str_replace($arrayDel""$fecha );
    
$fechaMin str_replace($arrayDel""$min );
    
$fechaMax str_replace($arrayDel""$max );

    if ( 
$fechaMin  <= $fechaTemp AND $fechaMax >= $fechaTemp 
    { 
        echo 
'valida';
    }
    else
    { 
        echo 
'invalida';
    }


comprobar('2017-04-06 11:00:00','6 15:00:00','4 12:00:00');
echo 
'<br>';

comprobar('2017-04-10 10:05:00','1 10:03:00','5 15:00:00');
echo 
'<br>';
Así conseguimos el mismo resultado en apenas 20 líneas.
La primera si cumple la condición, debería ser valido.
2017-04-06 11:00:00 que vendría a hacer jueves 11:00:00 y esta dentro
del sabado 15:00:00 hasta el jueves 12:00:00

si en vez del último parámetro '4 12:00:00' hubiese sido '4 10:00:00' ese sí seria invalido.
  #10 (permalink)  
Antiguo 09/04/2017, 14:00
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

No la primera no cumple la condicion, por que la fecha que estamos comparando debe ser mayor a la fecha minima.

4 es menor que 6, por lo que no se cumple.

Jueves es menor que Sabado por lo que no se cumple y no se va a cumplir

Código PHP:
<?php
function comprobar ($fecha$min$max)
{
    
$fecha date("N H:i:s"strtotime$fecha ) );
    
$arrayDel = array (' '':' );
    
$fechaTemp str_replace($arrayDel""$fecha );
    
$fechaMin str_replace($arrayDel""$min );
    
$fechaMax str_replace($arrayDel""$max );

    if ( 
$fechaMin  <= $fechaTemp AND $fechaMax >= $fechaTemp 
    { 
        echo 
'valida';
    }
    else
    { 
        echo 
'invalida';
    }

// Jueves 11.00 es mayor que Sabado 15.00? - NO
// Jueves 11.00 es menor que  Jueves 12.00? - SI
comprobar('2017-04-06 11:00:00','6 15:00:00','4 12:00:00');
// la primera no se cumple por lo tanto Invalido
/*
fecha min    = 6150000
fecha tem    = 4110000
fecha max    = 4120000
invalida
*/
echo '<br>';

// Lunes 10.05 es mayor que Lunes 10.03? - SI
// Lunes 10.05 es menor que Viernes 15.00? - SI
comprobar('2017-04-10 10:05:00','1 10:03:00','5 15:00:00');
// ambas se cumplen por lo tanto Valido
/*
fecha min    = 1100300
fecha tem    = 1100500
fecha max    = 5150000
valida
*/
echo '<br>';
PD: para domingo seria el 7 no el 0, como comentaste al principio, pero solo bastaria con restarle 1000000 a las fechas para adaptar la funcion.

Código PHP:
function comprobar ($fecha$min$max)
{
    
$fecha date("N H:i:s"strtotime$fecha ) );
    
$arrayDel = array (' '':' );
    
$fechaTemp str_replace($arrayDel""$fecha )-1000000;
    
$fechaMin str_replace($arrayDel""$min )-1000000;
    
$fechaMax str_replace($arrayDel""$max )-1000000;

    if ( 
$fechaMin  <= $fechaTemp AND $fechaMax >= $fechaTemp 
    { 
        echo 
'valida';
    }
    else
    { 
        echo 
'invalida';
    }

__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 09/04/2017 a las 14:15
  #11 (permalink)  
Antiguo 09/04/2017, 14:17
 
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

Cita:
Iniciado por xerifandtomas Ver Mensaje
No la primera no cumple la condicion, por que la fecha que estamos comparando debe ser mayor a la fecha minima.

4 es menor que 6, por lo que no se cumple.

Jueves es menor que Sabado por lo que no se cumple y no se va a cumplir

Código PHP:
<?php
function comprobar ($fecha$min$max)
{
    
$fecha date("N H:i:s"strtotime$fecha ) );
    
$arrayDel = array (' '':' );
    
$fechaTemp str_replace($arrayDel""$fecha );
    
$fechaMin str_replace($arrayDel""$min );
    
$fechaMax str_replace($arrayDel""$max );

    if ( 
$fechaMin  <= $fechaTemp AND $fechaMax >= $fechaTemp 
    { 
        echo 
'valida';
    }
    else
    { 
        echo 
'invalida';
    }

// Jueves 11.00 es mayor que Sabado 15.00? - NO
// Jueves 11.00 es menor que  Jueves 12.00? - SI
comprobar('2017-04-06 11:00:00','6 15:00:00','4 12:00:00');
// la primera no se cumple por lo tanto Invalido
/*
fecha min    = 6150000
fecha tem    = 4110000
fecha max    = 4120000
invalida
*/
echo '<br>';

// Lunes 10.05 es mayor que Lunes 10.03? - SI
// Lunes 10.05 es menor que Viernes 15.00? - SI
comprobar('2017-04-10 10:05:00','1 10:03:00','5 15:00:00');
// ambas se cumplen por lo tanto Valido
/*
fecha min    = 1100300
fecha tem    = 1100500
fecha max    = 5150000
valida
*/
echo '<br>';
PD: para domingo seria el 7 no el 0, como comentaste al principio, pero solo bastaria con restarle 1000000 a las fechas para adaptar la funcion.

Código PHP:
function comprobar ($fecha$min$max)
{
    
$fecha date("N H:i:s"strtotime$fecha ) );
    
$arrayDel = array (' '':' );
    
$fechaTemp str_replace($arrayDel""$fecha )-1000000;
    
$fechaMin str_replace($arrayDel""$min )-1000000;
    
$fechaMax str_replace($arrayDel""$max )-1000000;

    if ( 
$fechaMin  <= $fechaTemp AND $fechaMax >= $fechaTemp 
    { 
        echo 
'valida';
    }
    else
    { 
        echo 
'invalida';
    }

Entonces no se entendio lo que quería. jejeje.
Bueno, gracias de todas maneras por tu aporte.
Lo que quería ya lo tengo.

Saludos.
  #12 (permalink)  
Antiguo 09/04/2017, 14:21
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: Comprobar si fecha y hora cumple se encuentra en rango de semanas

Cita:
Iniciado por oggy_15_3 Ver Mensaje
Entonces no se entendio lo que quería. jejeje.
Bueno, gracias de todas maneras por tu aporte.
Lo que quería ya lo tengo.

Saludos.
Y puedes explicar que es lo que querias, por que aun que ya lo tengas me dejas intrigado.

Lo que yo entendi es que se quiere saber si un una fecha esta entre un dia y hora de la semana y otro?? no es esto lo que se pretende??
__________________
Unset($vida['malRollo']);
  #13 (permalink)  
Antiguo 09/04/2017, 14:44
 
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

[QUOTE=xerifandtomas;4815363]Y puedes explicar que es lo que querias, por que aun que ya lo tengas me dejas intrigado.

Claro.
Veras.. tome referencia php ya que es el lenguaje con la que más estoy trabajando,
pero en sí esta tarea la necesitaba en BASH.
Este script se ejecuta a través del CRON (linux) cada 15 min. de todos los días,
pero muy a parte de ejecutarse todos los días me indicaron que el contenido (querys que generan reportes) deben de ejecutarse en horas no laborales.

EJM:
Los reportes deben generarse si la fecha del sistema (ejecucion del CRON) cumple con lo siguiente:
-A partir del sabado 9pm hasta la hora 5am del dia lunes.
comprobar('2017-04-08 21:00:00','6 21:00:00','1 05:00:00')#valido

El primer parámetro siempre va a cambiar ya que es la fecha del sistema que se captura cada 15 min., pero el 2do y 3er parámetro son fijos.
Y yo a simple vista sé que si es una fecha y hora valida para que se ejecute mis reportes.
En pocas palabras el reporte no se ejecutara los lunes a partir de las 5:00:01 hasta los sábados 20:59:59

NOTA: el primer parámetro es una variable que captura la fecha del sistema.
Esa es mi lógica.
PD: Creo que debí postear este contenido al inicio, está más entendible.. sry

Última edición por oggy_15_3; 09/04/2017 a las 15:05

Etiquetas: cumple, encuentra, fecha, rango, semanas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:03.