2011-04-03 22 views
19

¿Alguien tiene un fragmento de PHP para calcular el siguiente día hábil para una fecha determinada? ¿Cómo se debe convertir, por ejemplo, YYYY-MM-DD para saber cuál es el siguiente día hábil?Siguiente día hábil de la fecha especificada en PHP

Ejemplo: Para el 03.04.2011 (DD-MM-YYYY) el siguiente día hábil es 04.04.2011. Para el 08.04.2011, el siguiente día hábil es el 11.04.2011.

Esta es la variable que contiene la fecha que necesito saber el siguiente día hábil para

$cubeTime['time']; 

variable contiene: 2011-04-01 resultado del fragmento debe ser: 2011-04-04

+1

http://stackoverflow.com/questions/336127/calculate-business-days – bensiu

Respuesta

67

siguiente día laborable

Esto encuentra el siguiente día laborable a partir una fecha específica (sin incluir el sábado o el domingo):

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

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

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

ACTUALIZACIÓN: O, si tiene acceso a PHP's DateTime class (muy probable):

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

desea omitir Vacaciones ?:

Aunque el cartel original mencionaba "No necesito considerar las vacaciones", si desea ignorarlo re vacaciones, solo recuerda: "Vacaciones" es solo una selección de las fechas que no deseas incluir y difiere según el país, la región, la empresa, la persona ... etc.

Simplemente ponga el código anterior en una función que excluya/pase más allá de 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 acortarse si lo desea. Traté de escribirlo de una manera fácil de entender.

+0

Perfecto, funciona como un encanto! ¡Muchas gracias! – Marko

+0

Esto no es del todo correcto. La pregunta para el siguiente día hábil de una fecha, es solo el siguiente día de la semana. ¿Qué hay de los días festivos, Navidad, etc.? –

+0

@John Hunt - "vacaciones" es solo una selección de las fechas que no desea incluir y difiere según el país, la región, la empresa, la persona ... etc. Simplemente ponga esto en una función que excluya/pase más allá de las fechas que no desea incluir ... es bastante fácil de incrementar, solo use '$ i' en lugar de' 1'. – Dave

0

lo que hay que hacer es:

  1. convertir la fecha prevista en una marca de tiempo.

  2. Uso esto junto con los o w o N formateadores de comandos de PHP date que le diga qué día de la semana es.

  3. Si no es un "día hábil", puede incrementar la marca de tiempo por día (86400 segundos) y volver a verificar hasta que llegue el día hábil.

NB: Para esto es realmente trabajo, que había también necesidad de excluir a cualquier banco o días festivos, etc.

+0

No necesito considerar las vacaciones. – Marko

1
function next_business_day($date) { 
    $add_day = 0; 
    do { 
    $add_day++; 
    $new_date = date('Y-m-d', strtotime("$date +$add_day Days")); 
    $new_day_of_week = date('w', strtotime($new_date)); 
    } while($new_day_of_week == 6 || $new_day_of_week == 0); 

    return $new_date; 
} 

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

0

Esta función calculará el día hábil en el futuro o en el pasado. Los argumentos son número de días, avance (1) o hacia atrás (0) y una fecha. Si no hay fecha se suministra la fecha de hoy será utilizado:

// returned $date Y/m/d 
function work_days_from_date($days, $forward, $date=NULL) 
{ 
    if(!$date) 
    { 
     $date = date('Y-m-d'); // if no date given, use todays date 
    } 

    while ($days != 0) 
    { 
     $forward == 1 ? $day = strtotime($date.' +1 day') : $day = strtotime($date.' -1 day'); 
     $date = date('Y-m-d',$day); 
     if(date('N', strtotime($date)) <= 5) // if it's a weekday 
     { 
      $days--; 
     } 
    } 
    return $date; 
} 
0

Me encontré un check in este hilo cuando estaba trabajando en un sitio web danés en el que necesitaba para codificar un script PHP "día siguiente entrega".

Esto es lo que me ocurrió con (Esto mostrará el nombre del siguiente día hábil en danés, y el siguiente trabajo + 1 si el tiempo actual es más que un límite dado)

$day["Mon"] = "Mandag"; 
$day["Tue"] = "Tirsdag"; 
$day["Wed"] = "Onsdag"; 
$day["Thu"] = "Torsdag"; 
$day["Fri"] = "Fredag"; 
$day["Sat"] = "Lørdag"; 
$day["Sun"] = "Søndag"; 

date_default_timezone_set('Europe/Copenhagen'); 

$date = date('l'); 
$checkTime = '1400'; 
$date2 = date(strtotime($date.' +1 Weekday')); 
if(date('Hi') >= $checkTime) { 
$date2 = date(strtotime($date.' +2 Weekday')); 
} 
if (date('l') == 'Saturday'){ 
$date2 = date(strtotime($date.' +2 Weekday')); 
} 
if (date('l') == 'Sunday') { 
$date2 = date(strtotime($date.' +2 Weekday')); 
} 
echo '<p>Næste levering: <span>'.$day[date("D", $date2)].'</span></p>'; 

Como Puede ver en el código de muestra $ checkTime donde establezco el límite de tiempo que determina si la entrega del día siguiente será +1 día laborable o +2 días hábiles.

'1400' = 14:00 horas

que conozco que las sentencias if se pueden hacer más comprimido, pero me muestran mi código para las personas a entender fácilmente la manera en que funciona.

Espero que alguien pueda usar este pequeño fragmento.

3

Para las vacaciones del Reino Unido puede utilizar

https://www.gov.uk/bank-holidays#england-and-wales

El formato de datos de ICS es fácil 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:(\\d{4})(\\d{2})(\\d{2}).*/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; 
} 
+0

Justo lo que estaba buscando. Gracias – Sahil

0

Véase el siguiente ejemplo:

$startDate = new DateTime('2013-04-01'); //intialize start date 
$endDate = new DateTime('2013-04-30'); //initialize end date 
$holiday = array('2013-04-11','2013-04-25'); //this is assumed list of holiday 
$interval = new DateInterval('P1D'); // set the interval as 1 day 
$daterange = new DatePeriod($startDate, $interval ,$endDate); 
foreach($daterange as $date){ 
if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday)) 
$result[] = $date->format("Y-m-d"); 
} 
echo "<pre>";print_r($result); 

Para más información: http://goo.gl/YOsfPX

0

Se podría hacer algo como esto.

/** 
* @param string $date 
* @param DateTimeZone|null|null $DateTimeZone 
* @return \NavigableDate\NavigableDateInterface 
*/ 
function getNextBusinessDay(string $date, ? DateTimeZone $DateTimeZone = null):\NavigableDate\NavigableDateInterface 
{ 
    $Date = \NavigableDate\NavigableDateFacade::create($date, $DateTimeZone); 

    $NextDay = $Date->nextDay(); 
    while(true) 
    { 
     $nextDayIndexInTheWeek = (int) $NextDay->format('N'); 

     // check if the day is between Monday and Friday. In DateTime class php, Monday is 1 and Friday is 5 
     if ($nextDayIndexInTheWeek >= 1 && $nextDayIndexInTheWeek <= 5) 
     { 
      break; 
     } 
     $NextDay = $NextDay->nextDay(); 
    } 

    return $NextDay; 
} 

$date = '2017-02-24'; 
$NextBussinessDay = getNextBusinessDay($date); 

var_dump($NextBussinessDay->format('Y-m-d')); 

Salida:

string(10) "2017-02-27" 

\NavigableDate\NavigableDateFacade::create($date, $DateTimeZone), es proporcionada por la biblioteca PHP disponible en https://packagist.org/packages/ishworkh/navigable-date. Primero debe incluir esta biblioteca en su proyecto con compositor o descarga directa.

Cuestiones relacionadas