Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Calcular Festivos y Fines de Semana

Estas en el tema de Calcular Festivos y Fines de Semana en el foro de PHP en Foros del Web. Para una herramienta que estoy desarrollando necesito calcular dias hábiles y festivos, googleando me encontré este código que lo hace @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver ...
  #1 (permalink)  
Antiguo 16/12/2015, 08:18
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Calcular Festivos y Fines de Semana

Para una herramienta que estoy desarrollando necesito calcular dias hábiles y festivos, googleando me encontré este código que lo hace

Código PHP:
Ver original
  1. function DiasHabiles($fecha_inicial,$fecha_final)
  2. {
  3. list($dia,$mes,$year) = explode("-",$fecha_inicial);
  4. $ini = mktime(0, 0, 0, $mes , $dia, $year);
  5. list($diaf,$mesf,$yearf) = explode("-",$fecha_final);
  6. $fin = mktime(0, 0, 0, $mesf , $diaf, $yearf);
  7.  
  8. $r = 1;
  9. while($ini != $fin)
  10. {
  11. $ini = mktime(0, 0, 0, $mes , $dia+$r, $year);
  12. $newArray[] .=$ini;  
  13. $r++;
  14. }
  15. return $newArray;
  16. }
  17.  
  18.  
  19. function Evalua($arreglo)
  20. {
  21. $feriados        = array(
  22. '1-1',  //  Año Nuevo (irrenunciable)
  23. '10-4',  //  Viernes Santo (feriado religioso)
  24. '11-4',  //  Sábado Santo (feriado religioso)
  25. '1-5',  //  Día Nacional del Trabajo (irrenunciable)
  26. '21-5',  //  Día de las Glorias Navales
  27. '29-6',  //  San Pedro y San Pablo (feriado religioso)
  28. '16-7',  //  Virgen del Carmen (feriado religioso)
  29. '15-8',  //  Asunción de la Virgen (feriado religioso)
  30. '18-9',  //  Día de la Independencia (irrenunciable)
  31. '19-9',  //  Día de las Glorias del Ejército
  32. '12-10',  //  Aniversario del Descubrimiento de América
  33. '31-10',  //  Día Nacional de las Iglesias Evangélicas y Protestantes (feriado religioso)
  34. '1-11',  //  Día de Todos los Santos (feriado religioso)
  35. '8-12',  //  Inmaculada Concepción de la Virgen (feriado religioso)
  36. '13-12',  //  elecciones presidencial y parlamentarias (puede que se traslade al domingo 13)
  37. '25-12',  //  Natividad del Señor (feriado religioso) (irrenunciable)
  38. );
  39.  
  40. $j= count($arreglo);
  41.  
  42. for($i=0;$i<=$j;$i++)
  43. {
  44. $dia = $arreglo[$i];
  45.  
  46.         $fecha = getdate($dia);
  47.             $feriado = $fecha['mday']."-".$fecha['mon'];
  48.                     if($fecha["wday"]==0 or $fecha["wday"]==6)
  49.                     {
  50.                         $dia_ ++;
  51.                     }
  52.                         elseif(in_array($feriado,$feriados))
  53.                         {    
  54.                             $dia_++;
  55.                         }
  56. }
  57. $rlt = $j - $dia_;
  58. return $rlt;
  59. }
  60.  
  61. $CantidadDiasHabiles = Evalua(DiasHabiles('19-10-2010','28-12-2010'));
  62.  
  63. echo   $CantidadDiasHabiles;
Sin Embargo, al ejecutarlo arroja unos NOTICES, que al parecer no afectan la ejecución del script pero son molestos a la hora de implementarlo, le he dado vueltas al código y no logro solucionarlos, alguien me puede dar una mano (que no sea ocultar los NOTICES en php.ini) gracias
__________________
Say no more.......
  #2 (permalink)  
Antiguo 16/12/2015, 09:23
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Calcular Festivos y Fines de Semana

Puedes enseñarnos los notice que te da? Más que nada para saber por donde van los tiros
  #3 (permalink)  
Antiguo 16/12/2015, 09:46
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Respuesta: Calcular Festivos y Fines de Semana

claro que si:

estos son:

Cita:
Notice: Undefined variable: dia_ in C:\wamp\www\consicon\movimientos\habiles.php on line 52
Cita:
( ! ) Notice: Undefined offset: 70 in C:\wamp\www\consicon\movimientos\habiles.php on line 46
__________________
Say no more.......
  #4 (permalink)  
Antiguo 16/12/2015, 09:49
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Respuesta: Calcular Festivos y Fines de Semana

Este es el codigo con las correcta numeracion de linea, pues veo que la linea 52 nno corresponde a la misma que tengo en sublime text
Código PHP:
Ver original
  1. <?php
  2. function DiasHabiles($fecha_inicial,$fecha_final)
  3. {
  4. list($dia,$mes,$year) = explode("-",$fecha_inicial);
  5. $ini = mktime(0, 0, 0, $mes , $dia, $year);
  6. list($diaf,$mesf,$yearf) = explode("-",$fecha_final);
  7. $fin = mktime(0, 0, 0, $mesf , $diaf, $yearf);
  8.  
  9. $r = 1;
  10. while($ini != $fin)
  11. {
  12. $ini = mktime(0, 0, 0, $mes , $dia+$r, $year);
  13. $newArray[]=$ini;  
  14. $r++;
  15. }
  16. return $newArray;
  17. }
  18.  
  19.  
  20. function Evalua($arreglo)
  21. {
  22. $feriados        = array(
  23. '1-1',  //  Año Nuevo (irrenunciable)
  24. '10-4',  //  Viernes Santo (feriado religioso)
  25. '11-4',  //  Sábado Santo (feriado religioso)
  26. '1-5',  //  Día Nacional del Trabajo (irrenunciable)
  27. '21-5',  //  Día de las Glorias Navales
  28. '29-6',  //  San Pedro y San Pablo (feriado religioso)
  29. '16-7',  //  Virgen del Carmen (feriado religioso)
  30. '15-8',  //  Asunción de la Virgen (feriado religioso)
  31. '18-9',  //  Día de la Independencia (irrenunciable)
  32. '19-9',  //  Día de las Glorias del Ejército
  33. '12-10',  //  Aniversario del Descubrimiento de América
  34. '31-10',  //  Día Nacional de las Iglesias Evangélicas y Protestantes (feriado religioso)
  35. '1-11',  //  Día de Todos los Santos (feriado religioso)
  36. '8-12',  //  Inmaculada Concepción de la Virgen (feriado religioso)
  37. '13-12',  //  elecciones presidencial y parlamentarias (puede que se traslade al domingo 13)
  38. '25-12',  //  Natividad del Señor (feriado religioso) (irrenunciable)
  39. );
  40.  
  41.  
  42. $j= count($arreglo);
  43.  
  44. for($i=0;$i<=$j;$i++)
  45. {
  46. $dia = $arreglo[$i];
  47.  
  48.         $fecha = getdate($dia);
  49.             $feriado = $fecha['mday']."-".$fecha['mon'];
  50.                     if($fecha["wday"]==0 or $fecha["wday"]==6)
  51.                     {
  52.                         $dia_ ++;
  53.                     }
  54.                         elseif(in_array($feriado,$feriados))
  55.                         {    
  56.                             $dia_++;
  57.                         }
  58. }
  59. $rlt = $j - $dia_;
  60. return $rlt;
  61. }
  62.  
  63. $CantidadDiasHabiles = Evalua(DiasHabiles('19-10-2010','28-12-2010'));
  64.  
  65. echo   $CantidadDiasHabiles;
  66.  ?>
__________________
Say no more.......
  #5 (permalink)  
Antiguo 17/12/2015, 07:26
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Calcular Festivos y Fines de Semana

El error es, el arreglo que estas pasando no contiene los indices que estas solicitando.

El error puede estar en el for $j sobrepasa el número de elementos que contiene el array

Por ejemplo si tu array tiene 10 elementos, las posiciones serán del 0 hasta el 9, no existe la posición 10.

En lugar de esto
Código PHP:
Ver original
  1. for($i=0;$i<=$j;$i++)// $i menor o igual que $j

Prueba esto
Código PHP:
Ver original
  1. for($i=0;$i<$j;$i++)// $i menor que $j

Última edición por xerifandtomas; 17/12/2015 a las 07:32
  #6 (permalink)  
Antiguo 17/12/2015, 08:02
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Respuesta: Calcular Festivos y Fines de Semana

Efectivamente era esa la solución, muchas gracias xeri
__________________
Say no more.......
  #7 (permalink)  
Antiguo 17/12/2015, 09:01
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Calcular Festivos y Fines de Semana

Vaya, creo que hubiera quedado mas simple si lo hacen con DateTime
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 17/12/2015, 09:12
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 10 meses
Puntos: 20
Respuesta: Calcular Festivos y Fines de Semana

Cita:
Iniciado por hhs Ver Mensaje
Vaya, creo que hubiera quedado mas simple si lo hacen con DateTime
y como sería eso, podrías ilustrarnos con tu aporte?
__________________
Say no more.......
  #9 (permalink)  
Antiguo 18/12/2015, 09:38
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Calcular Festivos y Fines de Semana

Código PHP:
Ver original
  1. $holiday = array(
  2.     '01-01',  //  Año Nuevo (irrenunciable)
  3.     '10-04',  //  Viernes Santo (feriado religioso)
  4.     '11-04',  //  Sábado Santo (feriado religioso)
  5.     '01-05',  //  Día Nacional del Trabajo (irrenunciable)
  6.     '21-05',  //  Día de las Glorias Navales
  7.     '29-06',  //  San Pedro y San Pablo (feriado religioso)
  8.     '16-07',  //  Virgen del Carmen (feriado religioso)
  9.     '15-08',  //  Asunción de la Virgen (feriado religioso)
  10.     '18-09',  //  Día de la Independencia (irrenunciable)
  11.     '19-09',  //  Día de las Glorias del Ejército
  12.     '12-10',  //  Aniversario del Descubrimiento de América
  13.     '31-10',  //  Día Nacional de las Iglesias Evangélicas y Protestantes (feriado religioso)
  14.     '01-11',  //  Día de Todos los Santos (feriado religioso)
  15.     '08-12',  //  Inmaculada Concepción de la Virgen (feriado religioso)
  16.     '13-12',  //  elecciones presidencial y parlamentarias (puede que se traslade al domingo 13)
  17.     '25-12',  //  Natividad del Señor (feriado religioso) (irrenunciable)
  18. );
  19.  
  20. $startDate = new DateTime( '2015-12-01' );    //inicia
  21. $endDate = new DateTime( '2016-01-30' );    //termina
  22.  
  23. $interval = new DateInterval('P1D');    // intervalo de un día
  24. /** @var \DateTime[] $date_range */
  25. $date_range = new DatePeriod($startDate, $interval ,$endDate); //creamos rango de fechas
  26.  
  27. $working_days = array();
  28. foreach($date_range as $date){
  29.     //Se considera el fin de semana y los feriados como no hábiles
  30.     if($date->format("N") <6 AND !in_array($date->format("d-m"),$holiday))
  31.         $working_days[] = $date->format("Y-m-d"); // se asignan fechas validas
  32. }
  33.  
  34. var_dump($working_days);
Recuerda probar el código, esto lo puedes meter fácilmente a una función o hacer una clase.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 18/12/2015 a las 10:24

Etiquetas: calcular, fecha, festivos, semana
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 23:38.