Position actuelle: Accueil> Derniers articles> Utilisez la fonction DATE_SUB pour soustraire les jours de semaine: comment éviter les week-ends

Utilisez la fonction DATE_SUB pour soustraire les jours de semaine: comment éviter les week-ends

gitbox 2025-05-28

Pourquoi cela fait-il une erreur de simplement réduire le nombre de jours?

Par exemple, supposons que aujourd'hui est lundi (2025-05-26), vous souhaitez soustraire 3 jours ouvrables. Si vous l'utilisez directement:

 $date = new DateTime('2025-05-26');
$date->sub(new DateInterval('P3D')); // moins3ciel
echo $date->format('Y-m-d');

Le résultat est 2025-05-23 (vendredi), ce qui semble correct. Mais si la date de début est lundi et que les jours de travail que vous soustrayez sont importants, il comprendra le samedi et le dimanche, et les résultats du calcul seront déviés.


Idées de solution

  1. Journées de réduction du cycle : Pour chaque jour de réduction, déterminez d'abord si le jour est un week-end (samedi ou dimanche).

  2. Sautez le week-end : si le jour est un week-end, la réduction n'est pas comptée sur la réduction de la semaine.

  3. Continuez à réduire le nombre de jours ouvrables pour répondre aux exigences .


Exemple de code

Vous trouverez ci-dessous un exemple de fonction soustraitworkingdays , qui commence par une date spécifiée, soustrait le nombre spécifié de jours de travail et saute les week-ends.

 function subtractWorkingDays(DateTime $date, int $days): DateTime {
    $result = clone $date; // Le clonage évite de modifier l'objet d'origine
    while ($days > 0) {
        $result->sub(new DateInterval('P1D')); // 每次减少一ciel
        $weekday = (int)$result->format('N'); // 1 (le lundi) arriver 7 (Dimanche)
        if ($weekday < 6) { // 只有le lundiarriver周五才算作工作日
            $days--;
        }
    }
    return $result;
}

// Exemple d&#39;utilisation
$startDate = new DateTime('2025-05-26');
$workDaysToSubtract = 3;

$newDate = subtractWorkingDays($startDate, $workDaysToSubtract);
echo $newDate->format('Y-m-d'); // Le résultat de sortie est2025-05-21,Sauter correctement le week-end

Analyse

  • Utilisez le format («n») pour obtenir le numéro de semaine, 1 est le lundi et 7 est dimanche.

  • Le nombre de jours de $ ne diminuera que lorsque la journée est une journée de travail (1 ~ 5).

  • En bouclant, assurez-vous que le nombre de jours soustraits est des jours ouvrables purement.


Résumer

  • Lorsque vous utilisez Date_Sub directement pour soustraire le nombre de jours, il peut inclure des week-ends, ce qui entraîne des erreurs de logique métier.

  • En déterminant cycliquement s'il s'agit d'une journée de travail et en comptant ne diminue uniquement le jour de travail, l'exigence de soustraire la journée de travail peut être réalisée avec précision.

  • Cette méthode est simple et efficace et convient à la plupart des scénarios qui nécessitent des calculs de jour de travail.