Rolf B: Samstag / Sonntag herausfiltern

Beitrag lesen

Hallo dedlfix,

nein, nicht iterieren. Man muss folgende Größen bestimmen:

  • W = Wochentag des Starttages, in PHP ist 0=Sonntag, 1=Montag, ..., 6=Samstag
  • die Differenz D der julianischen Tage von Ende- und Anfangsdatum. Dabei im Hinterkopf behalten, dass die Anzahl der Tage im Intervall um 1 größer ist, sofern $start und $ende Teil des betrachteten Zeitraums sind.
  • R = D % 7; // Rest von Intervallänge geteilt durch 7
  • Q = (D - R) / 7; // Integerquotient von D/7. Man könnte auch intdiv() verwenden...

D bestimmt man am leichtesten, indem man $start und $ende in DateTime-Objekte überführt und die diff-Methode anwendet (alternativ die date_diff-Funktion). Das DateDifference-Objekt, das dabei herauskommt, hat eine Eigenschaft days.

W bekommt man vom DateTime-Objekt von $start über die format("w") Methode.

Grundwert der Anzahl Wochenend-Tage im Zeitintervall ist WE=2*Q. Dazu kommen 1 oder 2 Tage, je nach dem, ob am Intervallrand Wochenendtage hinzukommen. Dazu bildet man die Summe S von W und R.

  1. Endet das Intervall an einem Samstag (S=6), wird WE um 1 erhöht
  2. Schließt das Intervall ein ganzes Wochenende ein (S>6), wird WE um 2 erhöht
  3. Beginnt das Intervall an einem Sonntag, wird WE um 1 erhöht

Fall 1 und Fall 2 schließen sich gegenseitig aus; Fall 3 kann gleichzeitig mit Fall 1 auftreten.

Klingt kompliziert. Ist es aber nicht 😉. Die Fälle 1-3 musste ich mir allerdings auch mal irgendwann in eine Tabelle vor Augen führen, um festzustellen, dass die 49 möglichen Kombinationen aus Start- und Endetag letztlich auf 3 Prüfungen zurückführbar sind.

Rolf

--
sumpsi - posui - clusi