×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Language: PHP
Posted by: JC Vásquez
Added: Mar 20, 2021 4:41 PM
Modified: Mar 31, 2021 3:32 PM
Views: 4778
Tags: dias habiles
  1. /**
  2.  * Calcula la cantidad de días hábiles transcurridos desde la
  3.  * fecha inicial hasta la fecha actual.
  4.  * Tiene en cuanta los días feriados en Guatemala
  5.  *
  6.  * @param date $fecha_inicial fecha inicial en formato AAAA-MM-DD
  7.  * @return String días hábiles desde la fecha inicial
  8.  */
  9. function dias_habiles($fecha_inicial) {
  10.     $fecha1 = date_create($fecha_inicial);
  11.     $fecha2 = date_create(date('Y-m-d'));
  12.    
  13.     $intervalo = date_diff($fecha1, $fecha2);
  14.     $dias_totales = $intervalo->format('%a');
  15.  
  16.     // Dias feriados:
  17.     // Semana Santa 2021: 04/01 y 04/02
  18.     // Semana Santa 2022: 04/14 y 04/15
  19.     // Semana Santa 2023: 04/06 y 04/07
  20.     $dias_feriados = array(
  21.         '01-01', // Año nuevo
  22.         '04-01', // Jueves Santo 2019
  23.         '04-02', // Viernes Santo 2019
  24.         '05-01', // Día del trabajo
  25.         '06-30', // Día del Ejército
  26.         '08-15', // Día de la Virgen de la Asunción
  27.         '09-15', // Día de la Independencia
  28.         '10-20', // Aniversario de la Revolución de Octubre
  29.         '11-01', // Día de los muertos
  30.         '12-24', // Nochebuena
  31.         '12-25', // Navidad
  32.         '12-31'  // Noche vieja
  33.     );
  34.  
  35.     // Dejamos fuera sabados y domingos
  36.     $finde = array(0, 6); // 0: domingo, 6:sabado
  37.  
  38.     $restar = 0;
  39.     for ($i = 1; $i <= $dias_totales; $i++) {
  40.         date_add($fecha1, date_interval_create_from_date_string('1 days'));
  41.         $dia_activo = date_format($fecha1, 'Y-m-d');
  42.         $dia_semana = date_format($fecha1, 'w');
  43.         $dia_finde = date_format($fecha1, 'D');
  44.         $fecha = date_format($fecha1, 'm-d');
  45.         if (in_array($dia_semana, $finde) OR in_array($fecha, $dias_feriados)) {
  46.             // sabado, domingo o día feriado quitamos un día
  47.             $restar++;
  48.         }
  49.     }
  50.     return str_pad($dias_totales - $restar, 2, "0", STR_PAD_LEFT);
  51. }