Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/09/2012, 21:53
davidmov
 
Fecha de Ingreso: octubre-2010
Mensajes: 14
Antigüedad: 16 años
Puntos: 0
Sonrisa Calculadora de días festivos Colombia

Hola.

Les dejo un código que desarrollé en PHP para que me compruebe si una fecha en formato "Y-m-d" es un festivo en Colombia o no.

Como la mayoría sabe, los festivos de algunos paises (en especial de latinoamérica) son variables, algunos son fijos y algunos dependen del cálculo de la pascua (Computus). Para ello usé dos funciones, una de estas la saqué de [URL="http://es.wikipedia.org/wiki/Anexo:Implementaciones_del_algoritmo_de_c%C3%A1lcu lo_de_la_fecha_de_Pascua#Algoritmo_en_PHP"]aquí[/URL].

No está muy pulido el código así que recibo sugerencias.

Espero que les sirva.

Código PHP:
<?php
$date_request
=$_REQUEST['date'];
$anio_act = date("Y");
$pascua_actual = pascua($anio_act);
$arr_fechas = array(
$anio_act."-01-01",
get_next_day($anio_act."-01-06"),
get_next_day($anio_act."-03-19"),
date("Y-m-d", strtotime("$pascua_actual -7 days")),
date("Y-m-d", strtotime("$pascua_actual -3 days")),
date("Y-m-d", strtotime("$pascua_actual -2 days")),
$pascua_actual,
$anio_act."-05-01",
date("Y-m-d", strtotime("$pascua_actual +43 days")),
date("Y-m-d", strtotime("$pascua_actual +64 days")),
date("Y-m-d", strtotime("$pascua_actual +71 days")),
get_next_day($anio_act."-06-29"),
$anio_act."-07-20",
$anio_act."-08-07",
get_next_day($anio_act."-08-15"),
get_next_day($anio_act."-10-12"),
get_next_day($anio_act."-11-01"),
get_next_day($anio_act."-11-11"),
$anio_act."-12-08",
$anio_act."-12-25"
);
if(
$date_request!=null){
    
$dc_dreq = date_create($date_request);
    
$tday = date_format($dc_dreq,"w");
    if(
$tday==0){
        echo 
"Sunday";
    }elseif(
$tday>0 && in_array($date_request,$arr_fechas)){
        echo 
"Holiday";
    }else{
        echo 
date("l", strtotime("$date_request"));
    }
}else{
    
print_r($arr_fechas);
}

function 
get_next_day($datebase){
    
$dc_date = date_create($datebase);
    
$nday = date_format($dc_date,"w");
    
$nday = intval($nday);
    if(
$nday==0){
        return 
date("Y-m-d", strtotime("$datebase +1 days"));
    }elseif(
$nday==1){
        return 
$datebase;
    }elseif(
$nday>1){
        
$add_days = 8-$nday;
        return  
date("Y-m-d", strtotime("$datebase +$add_days days"));
    }
}

function 
pascua ($anno){
# Constantes mágicas
    
$M = 24;
    
$N = 5;
#Cálculo de residuos
    
$a = $anno % 19;
    
$b = $anno % 4;
    
$c = $anno % 7;
    
$d = (19*$a + $M) % 30;
    
$e = (2*$b+4*$c+6*$d + $N) % 7;
# Decidir entre los 2 casos:
    
if ( $d + $e < 10 ) {
        
$dia = $d + $e + 22;
        
$mes = 3; // marzo
        
}
    else {
        
$dia = $d + $e - 9;
        
$mes = 4; //abril
        
}
# Excepciones especiales (según artículo)
    
if ( $dia == 26  and $mes == 4 ) { // 4 = abril
        
$dia = 19;
        }
    if ( 
$dia == 25 and $mes == 4 and $d==28 and $e == 6 and $a >10 ) { // 4 = abril
        
$dia = 18;
        }
    
$ret = date("Y-m-d",strtotime($anno.'-'.$mes.'-'.$dia));
        return (
$ret);
}
?>