Sven Rautenberg: PHP-Abfrage für die jeweiligen Wochenenden

Beitrag lesen

Moin!

==>Es geht darum, dass du in deiner Lösung von der falschen Tatsache ausgehst, ein Tage bestünde immer aus 24 Stunden

Lesen ist immer gut:

==>Aber du solltest vorher die Werte korrigieren, so das diese um 0.00 anfangen , also Uhrzeit weg.
Das kannst du mit date und mktime machen.

Gut, wir halten fest: Dein in https://forum.selfhtml.org/?t=161949&m=1053942 geposteter Code ohne Beachtung der Anmerkungen ist fehlerhaft, weil er zu inkorrekten Ergebnissen führt. Man sollte ihn so nicht verwenden.

Es geht nur um die Feststellung ob wir Sonnabend und Sonntag haben und nicht um die Uhrzeit - die Uhrzeit ist überhaupt nicht relevant.

Wenn man also den Aufruf von time() so korrigiert, dass nicht die aktuelle Uhrzeit verwendet wird, sondern derselbe Tag, aber 0:00 Uhr Mitternacht in die Berechnung eingeht, dann liefert dein Code nur unter der Voraussetzung korrekte Ergebnisse, dass tatsächlich in der jeweiligen Zeitzone die Sommerzeitumstellung nur am Sonntag irgendwann nach Mitternacht stattfindet, weil du mit deinen Berechnungen diese Grenze niemals überschreitest.

Dennoch ist zu kritisieren, dass du in deiner Überlegung von der falschen Annahme ausgehst, ein Tag hat in 100% aller Fälle exakt 86400 Sekunden. Würde man deine Lösung adaptieren, aber die Aufgabenstellung leicht abwandeln, indem man sagt: "Ich will nicht das kommende Wochenende, sondern das vergangene Wochenende ermitteln", würde man genau die Grenze der Zeitumstellung in Deutschland kreuzen und damit zu falschen Ergebnissen gelangen.

Von der Möglichkeit einer zeitlich anders platzierten Zeitumstellung in anderen Zeitzonen mal ganz abgesehen - Christian hat das ja schon ausführlich begründet.

Server stellen sich übrigens auch auf Sommer - und Winterzeit um.

Das stimmt - so halb. Server ändern die Zeitzone, auf der alle Ausgaben der lokalen Zeit basieren. Sie ändern aber NICHT den Unix-Timestamp. Der basiert einzig und allein auf der Anzahl vergangener Sekunden seit dem 1.1.1970 00:00 Uhr UTC.

Davon abgesehen, Sommer und Winterzeit spielen für den Einsatz keine Rolle.

Aber sicher doch. Dein Code enthält:
$wochentag=date('w',time());// 0 Sonntag .. 6 Sonnabend

time() liefert den auf der Zeitzone UTC basierenden Unix-Zeitstempel. date() berechnet aufgrund dieser Angabe und der Berücksichtigung der lokalen Zeitzone, die für den Server konfiguriert ist, das Tagesdatum und deshalb natürlich auch den Wochentag. Die lokale Zeitzone aber ändert sich, wenn zwischen Sommer- und Winterzeit gewechselt wird, was dafür sorgt, dass ein Tag eben auch mal nur 23 oder 25 Stunden lang ist.

Ich lande immer auf den korrekten Tag.

Weil du blind davon ausgehst, dass ein Tag 24 Stunden hat - und weil du zufälligerweise aufgrund der konkreten Ausarbeitung der Aufgabenstellung nicht in die Falle tappst.

Wäre gefordert worden, den Unix-Zeitstempel von Samstag 00:00:00 Uhr und Sonntag 23:59:59 Uhr auszugeben, wärst du zu 100% in diese Falle getappt. Dann gibt es nämlich keine Konstruktionsmöglichkeit mehr, die Sommerzeitumstellung durch glückliche Umstände elegant zu umschiffen.

Nehmen wir mal an wir hätten heute Umstellung auf die Sommerzeit, das würde bedeuten um 2 Uhr wird die Uhr auf 2 vorgestellt.
Das machen aber auch die Server.

Nein. Die Server stellen die Zeitzone um, der Unix-Timestamp erhöht sich pro Sekunde immer um exakt eine Sekunde.

Die Umstellung der Zeitzone hat zur Folge, dass die errechnete Lokalzeit um eine Stunde springt.

Aber egal ob ich nun um 2 Uhr oder um 3 einen Tag dazu rechne (egal ob Tag = Tag +1 oder Tag + 86400), das Vergleichsdatum bleibt immer der 18.11., da Uhrzeitanteile nicht gefragt sind.

Wenn du am Tag der Umstellung von Sommerzeit auf Winterzeit nachts zwischen 00:00 und 00:59 diese Rechnung durchführst, wirst du bei der Datumsanzeige wieder nur auf Sonntag landen. Der Sonntag ist 25 Stunden lang (wenn man nur Datum und Uhrzeit, aber wie üblich nicht die Zeitzone notiert), d.h. zum Beispiel 00:30 Uhr plus 24 Stunden landet bei 24:30 Uhr - aber erst um 25:00 Uhr ist der nächste Tag erreicht.

Du hast also für eine Stunde im Jahr das falsche Ergebnis. Korrekt hingegen ist, wenn man nur mit dem Tagesdatum rechnen will, auch nur "ein Tag" auf das Tagesdatum zu addieren, und die Zeitzonenfrage dadurch auszuklammern - nicht mit 86400 Sekunden in genau diese Falle zu tappen.

Nun - alles klar.

Mir schon lange - dir auch?

- Sven Rautenberg

--
"Love your nation - respect the others."