2010-11-23 5 views
39

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

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

Dans certains pays du Moyen Orient un week-end une semaine de travail du dimanche au jeudi. Avez-vous pensé à eux: O –

+2

C'est pour savoir combien de jours dans le futur la date limite de paiement est pour un événement local, donc non :-) – fredley

+0

Vous devez aussi penser aux vacances. – yvoyer

Répondre

79

Si vous êtes limité à la semaine, utilisez la chaîne jours de la semaine.

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

Cela devrait vous faire bondir de 3 jours de la semaine, donc si c'est jeudi, il va ajouter l'heure de fin de semaine supplémentaire.

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

+39

No * way. * Cela fonctionne? Y at-il quelque chose que strtotime() ne peut pas faire? –

+0

@Pekka J'ai parfois été foutu par son incapacité à des choses comme "le premier jour du mois il y a 10 mois" et "le premier jour de ce mois". – Yahel

+1

Cela fonctionne buggé cependant: 'écho date ('Y-m-d', strtotime ('2011-03-27 + 5 jours de la semaine'));' Prévu le 1er avril, obtenu le 3 avril. – zerkms

2

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

Apparemment bien d'abord après avoir ajouté> 5 jours ouvrables (similaire à ce que @zerkms 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); 
    } 
0

Je pense que la fonction peut être facilement développé que vous pouvez simplement exporter jour actuel pas de la semaine et vous pouvez ajouter deux et mod 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 du jour de la semaine en utilisant un tableau, cette méthode peut également être utilisée.

0

je le fais récursive, a 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

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; 

} 
Questions connexes