0 votos

PHP Sumar días hábiles a partir de una fecha

Buenas espero que me puedan ayudar estoy queriendo sumar 10 días hábiles (Lunes a Viernes) y sin contar feriados a partir de una fecha Lo que hecho es sumarle 10 días pero no quiero que cuente los sábados ni domingos y tampoco los feriados

Por ejemplo estos son algunos feriados

2015-12-08 2015-12-25 2016-01-01

<?php

require_once('conexion.php');

$num_accion=$_POST['num_accion'];
$fecha_noti=$_POST['fecha_noti'];

$fecha_venci_noti= date("Y-m-d", strtotime("$fecha_noti + 10 days"));

$sql="update tbldias set 

dc_fecha_noti='".$fecha_noti."',
dc_fecha_venci_noti='".$fecha_venci_noti."' 

where dc_num_accion=".$num_accion;

$res=mysql_query($sql,$cnx);

?>

1voto

Deleted Puntos 530

Parece que tienes un problema de lógica. Tienes una fecha x y necesitas una fecha contando 10 días hábiles a partir de ahí, es decir que si es 'lunes 1' la fecha que quieres es 'viernes 12'. Suponiendo que no hay feriados por medio claro, voy a llamarle 'festivos' yo. Creo que había un problema similar en otra ocasión, miralo: 'http://www.iteramos.com/pregunta/56444/como-obtener-total-de-semanas-del-ano'

Bueno, por partes.

  1. Fines de semana. Primero debes averiguar el día de la semana, si el día es lunes ya tienes que sumar 12 días (coges un sábado y domingo por medio), pero ¿si es martes? Pues como resulta que la siguiente fecha caería en sábado y esto no puede ser... ya sumas 14 días. Ve mirando para el resto.

  2. Los festivos. Estos son mas problemáticos, primero vas a tener que almacenarlos manualmente, p.e. en un array y a veces cambian anualmente... al menos en España, que los hay fijos pero otros van y vienen... Es el calendario laboral y nadie sabe como será el año que viene, conque un nuevo array cada año para que esto funcione, bueno una tabla y un formulario de entrada puede ser mas lógico. Una vez que los tienes, cuando hagas el calculo semanal del punto 1, tendrás que comprobar el periodo, de 12, 14 días o el que sea y ver si hay festivos en medio, si es así a sumar y si la fecha cae en sabado sumas 2, si cae en domingo 1.

Creo que puede funcionar. Un saludo.

0voto

Ivan Muñoz Puntos 1135

Buenas Tardes,

Primero que nada debes tener un arreglo con todos los feriados (o almenos los de tu interes). Para la logica nesecitas un bucle que se detenga cuando tengas tus 10 dias hábiles y dentro del bucle solo aumentas el contador de dias cuando no es un feriado, Sabado o Domingo.

Aca El codigo:

<?php
require_once('conexion.php');

$num_accion=$_POST['num_accion'];
$fecha_noti=$_POST['fecha_noti'];

//Arreglo con todos los feriados
$feriados = array(
    '2015-12-08',
    '2015-12-25',
    '2016-01-01',
    );

//Timestamp De Fecha De Comienzo
$comienzo = strtotime($fecha_noti);

//Inicializo la Fecha Final
$fecha_venci_noti = $comienzo;

//Inicializo El Contador
$i = 0;
while ($i < 10) {
    //Le Sumo un Dia a La Fecha Final (86400 Segundos)
    $fecha_venci_noti += 86400;

    //Inicializo a FALSE La Variable Para Saber Si Es Feriado
    $es_feriado = FALSE;

    //Recorro Todos Los Feriados
    foreach ($feriados as $key => $feriado) {
        //Verifico Si La Fecha Final Actual Es Feriado O No
        if (date("Y-m-d", $fecha_venci_noti) === date("Y-m-d", strtotime($feriado))) {
            //En Caso de Ser feriado Cambio Mi variable A TRUE
            $es_feriado = TRUE;
        }
    }

    //Verifico Que No Sea Un Sabado, Domingo O Feriado
    if (!(date("w", $fecha_venci_noti) == 6 || date("w", $fecha_venci_noti) == 0 || $es_feriado)) {
        //En Caso De No Ser Sabado, Domingo O Feriado Aumentamos Nuestro contador
        $i++;
    }
}

$sql="update tbldias set 

dc_fecha_noti='".$fecha_noti."',
dc_fecha_venci_noti='".$fecha_venci_noti."' 

where dc_num_accion=".$num_accion;

$res = mysql_query($sql,$cnx);
?>

No te olvides de poner los feriados en el Array

0 votos

gracias Ivan Muños pero cuando se trata de guardar la fecha_venci_noti sale 79125482 es decir un numero entero y no una fecha

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X