2010-11-23 17 views
39

¿Hay alguna manera de usar strtotime para agregar días laborables (de lunes a viernes) a una fecha? ¿O algún otro método? Lo que quiero hacer es:Días laborables (lunes a viernes) en PHP

date ('Y-m-j' , strtotime ('+3 working days')) 
+7

En algunos países del Medio Oriente un fin de semana a la semana de trabajo es de domingo a jueves. ¿Ha pensado en ellos? O –

+2

Esto es para calcular cuántos días en el futuro el plazo de pago es para un evento local, entonces no :-) – fredley

+0

También debe pensar en los días festivos. – yvoyer

Respuesta

79

Si se limita a los días laborables, utilice la cadena entre semana.

echo date ('Y-m-j' , strtotime ('3 weekdays')); 

Esto debería adelantarse 3 días laborables, por lo que si es jueves, agregará el tiempo adicional de fin de semana.

Fuente: http://www.php.net/manual/en/datetime.formats.relative.php

+39

No * way. * Esto funciona? ¿Hay algo que 'strtotime()' no pueda hacer? –

+0

@Pekka De vez en cuando me fastidió su incapacidad para cosas como "el primer día del mes hace 10 meses" y "el primer día de este mes". – Yahel

+1

Sin embargo, funciona con errores: 'echo date ('Y-m-d', strtotime ('2011-03-27 + 5 weekdays')); 'Esperado el 1 de abril, tengo el 3 de abril. – zerkms

2

He encontrado este cochecito cuando se necesita una mayor cantidad de días de la semana. Estaba buscando X cantidad de días hábiles después del 1 ° del mes actual.

Se veía bien al principio hasta después de agregar> 5 días hábiles (similar a lo que se encontró @zerkms).

Esto ha demostrado ser más preciso para mí.

function _getBusinessDayOfMonth($days) { 
     $time = strtotime(date("m/1/Y 00:00")); //finding # of business days after 1st of the month 
     $i = 0; //start with zero 
     while ($i < $days) { //loop through until reached the amount of weekdays 
      $time = strtotime("+1 day", $time); //Increase day by 1 
      if (date("N", $time) < 6) { //test if M-F 
       $i++; //Increase by 1 
      } 
     } 
     echo date("m/d/Y", $time); 
    } 
0

creo que una función se puede desarrollar fácilmente que sólo se puede exportar día actual de la semana hay y se puede añadir dos y mod del 5 le dará facilidad de lunes a viernes.

function increaseWorkDay($workDayToProcess, $dayToAdd){ 
    if($workDayToProcess >= 4 && $workDayToProcess <= 6){ 
     $workDayToProcess= 4; 
    } 
    $workDayToProcess+= $dayToAdd; 

    return $workDayToProcess % 5; 
} 

Y puede exportar el nombre del día de la semana mediante el uso de una matriz, este método puede utilizarse alternativamente.

0

lo hago de forma recursiva, trabajó para mí

function add_work_days($date, $day){ 
    if($day == 0) 
     return $date; 

    $date->add(new DateInterval('P1D')); 

    if(!in_array($date->format('N'), array('6', '7'))) 
     $day--; 

    return add_work_days($date, $day); 
} 

$date = add_work_days(new DateTime(), 3); 
echo $date->format('d/m/Y'); 
0

Para versiones anteriores de PHP 5.3 <

function AddWorkingDays($startDate, $adddays) 
{ 
    $retdate = $startDate; 
    $sign = "+"; 
    if($adddays < 0){ 
    $adddays = $adddays*-1; 
    $sign = "-"; 
    } 
    while ($adddays > 0) { 
    $retdate = date ('Y-m-d' , strtotime ("$retdate {$sign}1 day")); 

     $what_day = date("N", strtotime($retdate)); 
     if ($what_day != 6 && $what_day != 7) // 6 and 7 are weekend 
      $adddays--; 

    }; 

    return $retdate; 

} 
Cuestiones relacionadas