Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie die Date_sub -Funktion, um Wochentage zu subtrahieren: So vermeiden Sie Wochenenden

Verwenden Sie die Date_sub -Funktion, um Wochentage zu subtrahieren: So vermeiden Sie Wochenenden

gitbox 2025-05-28

Warum macht es einen Fehler, einfach die Anzahl der Tage zu reduzieren?

Nehmen wir beispielsweise an, heute ist Montag (2025-05-26), Sie möchten 3 Arbeitstage subtrahieren. Wenn Sie es direkt verwenden:

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

Das Ergebnis ist 2025-05-23 (Freitag), was korrekt zu sein scheint. Wenn das Startdatum jedoch Montag ist und die Arbeitstage, die Sie abziehen, groß sind, umfasst es Samstag und Sonntag, und die Berechnungsergebnisse werden abgewichen.


Lösungsideen

  1. Fahrradreduktionstage : Stellen Sie für jeden Tag der Reduktion zuerst fest, ob der Tag ein Wochenende (Samstag oder Sonntag) ist.

  2. Überspringen Sie das Wochenende : Wenn der Tag ein Wochenende ist, wird die Reduzierung nicht auf die Reduzierung des Wochentags gezählt.

  3. Reduzieren Sie weiterhin die Anzahl der Arbeitstage, um die Anforderungen zu erfüllen .


Codebeispiel

Im Folgenden finden Sie eine Beispielfunktion subtrahieren Arbeitstage , die mit einem bestimmten Datum beginnt, die angegebene Anzahl von Arbeitstagen abzieht und Wochenenden überspringt.

 function subtractWorkingDays(DateTime $date, int $days): DateTime {
    $result = clone $date; // Das Klonieren vermeidet es, das ursprüngliche Objekt zu modifizieren
    while ($days > 0) {
        $result->sub(new DateInterval('P1D')); // 每次减少一Himmel
        $weekday = (int)$result->format('N'); // 1 (am Montag) ankommen 7 (Sonntag)
        if ($weekday < 6) { // 只有am Montagankommen周五才算作工作日
            $days--;
        }
    }
    return $result;
}

// Beispiel für die Nutzung
$startDate = new DateTime('2025-05-26');
$workDaysToSubtract = 3;

$newDate = subtractWorkingDays($startDate, $workDaysToSubtract);
echo $newDate->format('Y-m-d'); // Das Ausgangsergebnis ist2025-05-21,Überspringen Sie das Wochenende richtig

Analyse

  • Verwenden Sie das Format ('n') , um die Woche zu erhalten, 1 ist Montag und 7 ist Sonntag.

  • Die Anzahl der $ -Tage wird nur abnehmen, wenn der Tag ein Arbeitstag ist (1 ~ 5).

  • Stellen Sie durch die Looping sicher, dass die Anzahl der abgezogenen Tage nur Arbeitstage beträgt.


Zusammenfassen

  • Bei der Verwendung von DATE_SUB , um die Anzahl der Tage direkt zu subtrahieren, kann es Wochenenden enthalten, was zu Geschäftslogikfehlern führt.

  • Indem Sie zyklisch feststellen, ob es sich um einen Arbeitstag handelt und das Zählen nur am Arbeitstag abnimmt, kann das Subtrahieren des Arbeitstages genau realisiert werden.

  • Diese Methode ist einfach und effizient und für die meisten Szenarien geeignet, die am Arbeitstag Berechnungen erfordern.