Gunnar Bittersmann: Rechnen mit Datum / Brett vorm Kopf

Beitrag lesen

@@Pit

Das Rechnen mit Zeitpunkten/Daten ist eigentlich recht einfach, wenn man folgende Grundregel verinnerlicht hat: Rechne immer mit timestamps! Die Formatierung in ein menschenfreundliches Format (Jahr/Monat/Tag oder Jahr/Kalenderwoche/Wochentag) passiert bei der Ausgabe; keinen Moment früher.

Um von deinem Startzeitpunkt zum Zeitpunkt eine Woche später zu kommen, musst du die Anzahl der Sekunden einer Woche draufaddieren. (PHP rechnet in Sekunden; JavaScript in Millisekunden.)

Ich nehme an, du willst die Zeitpunkte in der lokalen Zeit haben, 1518998100 soll 2018-02-19 00:55 MEZ sein (also Montag der 8. KW), nicht 2018-02-18 23:55 UTC (Sonntag der 7. KW).

Dann kann es allerdings passieren, dass du beim Aufaddieren in der falschen KW landest, wenn zwischendurch die Zeit umgestellt wird. Bsp.: auf 2018-03-18 23:55 MEZ (Sonntag der 11.KW) die Anzahl der Sekunden einer Woche draufaddiert ergibt 2018-03-26 00:55 MESZ (Montag der 13.KW); auf 2018-10-22 00:55 MESZ (Montag der 43. KW) draufaddiert ergibt 2018-10-28 23:55 MEZ (Sonntag der 43. KW).

Um das zu verhindern, setzt du die Uhrzeit (um die geht es dir ja nicht) der betreffenden Tage auf 12:00 mittags. In deinem Beispiel machst du den Startzeitpunkt 2018-02-20 04:00 MEZ (1519095600) zu 2018-02-20 12:00 MEZ (1519124400).

Auf diesen Startzeitpunkt kannst du in einer Schleife jeweils die Anzahl der Sekunden einer Woche draufaddieren und den Zeitpunkt in einem Array ablegen – im gewünschten Format Jahr/Kalenderwoche[1] –, solange der Zeitpunkt vor dem Endzeitpunkt liegt. Danach musst du prüfen, ob du die Kalenderwoche des Endzeitpunkts schon erfasst hast, also ob die Kalenderwoche des letzten Elements im Array mit der des Endzeitpunkts übereinstimmt. Wenn nicht, letztere noch ergänzen. Fertig.

LLAP 🖖

--
„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann

  1. Das Format sollte wohl besser standardgemäß 2018-W11 (oder 2018W11) sein, nicht 11_2018. ↩︎