Saltar al contenido

Siguiente día hábil de la fecha dada en PHP

Te sugerimos que revises esta resolución en un entorno controlado antes de pasarlo a producción, saludos.

Solución:

Próximo día de la semana

Esto encuentra el próximo día de la semana a partir de una fecha específica (sin incluir sábado o domingo):

echo date('Y-m-d', strtotime('2011-04-05 +1 Weekday'));

También podría hacerlo con una variable de fecha, por supuesto:

$myDate = '2011-04-05';
echo date('Y-m-d', strtotime($myDate . ' +1 Weekday'));

ACTUALIZAR: O, si tiene acceso a la clase DateTime de PHP (muy probable):

$date = new DateTime('2018-01-27');
$date->modify('+7 weekday');
echo $date->format('Y-m-d');

¿Quieres saltarte las vacaciones?:

Aunque el cartel original mencionaba “No necesito considerar las vacaciones”, si SÍ quieres ignorar las vacaciones, solo recuerda: “Vacaciones” es solo una array de cualquier fecha que no desee incluir y difiere según el país, la región, la empresa, la persona, etc.

Simplemente coloque el código anterior en una función que excluya/repita las fechas que no desea incluir. Algo como esto:

$tmpDate = '2015-06-22';
$holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
$i = 1;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));

while (in_array($nextBusinessDay, $holidays)) 
    $i++;
    $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));

Estoy seguro de que el código anterior se puede simplificar o acortar si lo desea. Traté de escribirlo de una manera fácil de entender.

Para vacaciones en el Reino Unido, puede usar

https://www.gov.uk/bank-holidays#inglaterra-y-gales

Los datos en formato ICS son fáciles de analizar. Mi sugerencia es…

# $date must be in YYYY-MM-DD format
# You can pass in either an array of holidays in YYYYMMDD format
# OR a URL for a .ics file containing holidays
# this defaults to the UK government holiday data for England and Wales
function addBusinessDays($date,$numDays=1,$holidays='') 
    if ($holidays==='') $holidays = 'https://www.gov.uk/bank-holidays/england-and-wales.ics';

    if (!is_array($holidays)) 
        $ch = curl_init($holidays);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        $ics = curl_exec($ch);
        curl_close($ch);
        $ics = explode("n",$ics);
        $ics = preg_grep('/^DTSTART;/',$ics);
        $holidays = preg_replace('/^DTSTART;VALUE=DATE:(\d4)(\d2)(\d2).*/s','$1-$2-$3',$ics);
    

    $addDay = 0;
    while ($numDays--) 
        while (true) 
            $addDay++;
            $newDate = date('Y-m-d', strtotime("$date +$addDay Days"));
            $newDayOfWeek = date('w', strtotime($newDate));
            if ( $newDayOfWeek>0 && $newDayOfWeek<6 && !in_array($newDate,$holidays)) break;
        
    

    return $newDate;

function next_business_day($date) 

Esta función debería ignorar los fines de semana (6 = sábado y 0 = domingo).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *