Christian Seiler: Mit PHP per Schleife durch Datumsbereich?

Beitrag lesen

Hallo Klaus,

suche nach einer Möglichkeit mittels einer Schleife durch einen Datumsbereich zu laufen, um dann für jeden Tag eine Prüfung oder ähnliches durchführen zu können.

Dachte, dass es gaaanz einfach gehen könnte mittels:

[...]

Funktioniert aber leider gar nicht.

Naja, das funktioniert schon, nur nicht so, wie Du erwartet hast. Denn: mktime() liefert einen Timestamp und der ist Sekundengenau. Sprich: Wenn Du einen Tag addieren willst, dann musst Du eine größere Zahl pro Schleifendurchlauf addieren. Allerdings: Auf Grund von Sommer- und Winterzeit kann man nicht einfach 86400 Sekunden addieren (= 24 * 60 * 60), das fliegt auch auf die Schnauze, siehe auch ein analoges Problem in Python.

Im folgenden zwei Möglichkeiten (die wurden auch in dem anderen Posting von mir angesprochen, siehe dort die Details zum Thema):

  1. (Weniger Empfehlenswert) Die Methode über "12 Uhr Mittags":
$starttag = "08";  
$startmonat = "10";  
$startjahr = "2007";  
$endetag = "25";  
$endemonat = "11";  
$endejahr = "2007";  
  
$vdate = mktime(12,0,0,$startmonat,$starttag,$startjahr);  
$bdate = mktime(12,0,0,$endemonat,$endetag,$endejahr);  
  
// Sicherheitshalber +3600 rechnen, damit bei Sommer/Winterzeitumstellung  
// Die Grenze korrekt erkannt wird - es ist bei dieser Methode auch nur  
// möglich, *einschließlich* des Enddatums zu rechnen, *ausschließlich*  
// (d.h. < statt <=) fliegt bei der umgekehrten Umstellung auf die Schnauze.  
for ($i = $vdate; $i <= $bdate + 3600; $i += 86400) {  
 $test = date("Y-m-d",$i);  
 echo $test."<br>\n";  
}
  1. (Meine Empfehlung) Die Methode über GMT (beachte das 'gm' vor den Funktionen):
$starttag = "08";  
$startmonat = "10";  
$startjahr = "2007";  
$endetag = "25";  
$endemonat = "11";  
$endejahr = "2007";  
  
$vdate = gmmktime(0,0,0,$startmonat,$starttag,$startjahr);  
$bdate = gmmktime(0,0,0,$endemonat,$endetag,$endejahr);  
  
// Hier auch einschließlich (<=), obwohl hier ausschließlich (<) auch  
// funktionieren würde.  
for ($i = $vdate; $i <= $bdate; $i += 86400) {  
 $test = gmdate("Y-m-d",$i);  
 echo $test."\n";  
}

Die zweite Methode dürfte auch schneller sein und ist weniger fehleranfällig.

Viele Grüße,
Christian