web-dev-qa-db-fra.com

Jours ouvrables (du lundi au vendredi) en PHP

Existe-t-il un moyen d'utiliser strtotime pour ajouter des jours ouvrables (du lundi au vendredi) à une date? Ou une autre méthode? Ce que je veux faire c'est:

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

Si vous vous limitez aux jours de semaine, utilisez la chaîne jours de semaine.

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

Cela devrait vous faire avancer de 3 jours en semaine, donc si c'est jeudi, cela ajoutera le temps de week-end supplémentaire.

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

95
John Giotta

Pour PHP> = 5.6

public function addWorkingDays($date, $day)
{

    if (!($date instanceof \DateTime) || is_string($date)) {
        $date = new \DateTime($date);
    }

    if ($date instanceof \DateTime) {
        $newDate = clone $date;
    }

    if ($day == 0) {
        return $newDate;
    }

    $i = 1;

    while ($i <= abs($day)) {

        $newDate->modify(($day > 0 ? ' +' : ' -') . '1 day');

        $next_day_number = $newDate->format('N');

        if (!in_array($next_day_number, [6, 7])) {
            $i++;
        }

    }

    return $newDate;

}
2
ghindows

J'ai trouvé ce buggy lorsque j'ai besoin d'un plus grand nombre de jours de semaine. Je cherchais X quantité de jours ouvrables après le 1er du mois en cours.

Superbe au début jusqu'à après avoir ajouté> 5 jours ouvrables (similaire à ce que @zerkms a trouvé).

Cela s'est avéré plus précis pour moi.

    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);
    }
2
mpickens

Je le fais récursivement, j'ai travaillé pour moi

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
Pedro H. de França

Je pense qu'une fonction peut être facilement développée que vous pouvez simplement exporter le jour courant de la semaine et vous pouvez en ajouter deux et le mod de 5 vous donnera facilement en semaine.

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

    return $workDayToProcess % 5;
}

Et vous pouvez exporter le nom de la semaine en utilisant un tableau, cette méthode peut également être utilisée.

0
CSelcukB

Pour les anciennes versions 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;

}
0
ram