Christian Seiler: PHP-Abfrage für die jeweiligen Wochenenden

Beitrag lesen

Hallo,

Ich kann mich nur wiederholen
[...]

Ja, das habe ich gelesen und darauf bin ich auch eingegangen. Lies Dir doch bitte ENDLICH mal durch, was ICH schrieb.

Nochmal: Du postest Code, der nachweislich fehlerhaft ist (siehe mein voriges Posting). Dann schreibst Du noch folgenden NEBENSATZ dazu:

==>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.

Ja. Toll. Erstens ist das GAR NICHT in Deinem Code enthalten, zweitens wird nicht erwähnt, WARUM das gebraucht wird. Wenn jemand also Dein Posting liest, wird er evtl. nur den Code nehmen und da er SCHEINBAR funktioniert, wird er den Code übernehmen, OHNE Deinen Nebensatz zu beachten - weil Du ihn NICHT explizit davor warnst, dass es OHNE diese Sache zu Problemen kommen kann.

ZUDEM hast Du noch das Problem, dass Dein Code nur hier in EUROPA ZUFÄLLIGERWEISE funktioniert, weil bei Dir gerade SONNTAG die Grenze ist und SONNTAG auch die Zeitumstellung ist!

Gehen wir mal nach Chowd ins Jahr 2004. Das liegt in der Mongolei. Dort wurde am Samtsag (und nicht - wie bei uns - am Sonntag!), den 25. September 2004 die Zeit von Sommer- auf Winterzeit umgestellt.

Beachte, dass PHPs Datums- und Zeitfunktionen per Default die Länder- und Zeiteinstellungen des Servers beachten, man sie aber ab PHP 5.2 (oder 5.1?) auch selbst beeinflussen kann.

Im folgenden habe ich an Deinen Code lediglich ein date_default_timezone_set() hinzugefügt (wie gesagt: ab PHP 5.2), damit er eine andere Zeitzone zur Berechnung nutzt. Ansonsten ist Dein Code identisch:

<?php  
  
date_default_timezone_set ('Asia/Hovd');  
  
// hier nun mal der Gegentest  
echo '<hr />';  
$datum = 1096041600;  
echo date('j.m.Y H:i:s',$datum)."  Das ist das Datum um die Routine anschmieren zu wollen<br />\n";  
$heute = mktime(0, 0, 0, date('m',$datum),date('j',$datum),date('Y',$datum));  
$t1=array(-86400,432000,345600,259200,172800,86400,0);  
$t2=array(0,518400,432000,345600,259200,172800,86400);  
$wochentag=date('w',$heute);// 0 Sonntag .. 6 Sonnabend  
$p1=$t1[$wochentag]+$heute;  
$p2=$t2[$wochentag]+$heute;  
echo date('j.m.Y',$p1)."<br />\n";  
echo date('j.m.Y',$p2)."<br />\n";  
  
?>

Und was passiert als Ausgabe?

25.09.2004 00:00:00  Das ist das Datum um die Routine anschmieren zu wollen
25.09.2004
25.09.2004

Oh, 2x das gleiche Datum? Sowas aber auch...

Um mich jetzt NOCHMAL zu WIEDERHOLEN: Es ist reiner ZUFALL, dass die Routine von Dir HIER IN EUROPA funktioniert. Zum einen funktioniert sie WOANDERS nicht (siehe meine obige Demonstration), zum ANDEREN wird Deine Routine für JEDEN ANDEREN Wochentag als Sonntag GEHÖRIG auf die Schnauze fliegen. Wenn Du mit der gleichen Methode also zum Beispiel die Zeitspanne der nächsten ARBEITSWOCHE berechnen willst, dann hast Du hier in Deutschland das gleiche Problem, wie mit Deiner anderen Methode in der Mongolei (und noch an anderen Orten, es gibt noch eine Menge mehr Länder, die nicht Sonntags umstellen [1]).

Also: Lies Dir nochmal mein Archivposting durch und erkenne, warum 86400 Sekunden zu addieren eine VERDAMMT SCHLECHTE IDEE ist, wenn man Datumsberechnungen anstellen will (zumindest wenn man Lokalzeit benutzt). Dass Du bisher Glück gehabt hast, ändert nichts an den grundsätzlichen Denkfehlern, die Du begehst.

Viele Grüße,
Christian

[1] Gut, Mongolei stellt inzwischen gar nicht mehr um, war
halt das erste Beispiel, das ich gefunden habe.