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).