Christian Seiler: Mit PHP per Schleife durch Datumsbereich?

Beitrag lesen

Hallo,

$starttag = "8";
$startmonat = "10";
$startjahr = "2007";
$endetag = "25";
$endemonat = "11";
$endejahr = "2007";

$vdate = mktime(0,0,0,$startmonat,$starttag,$startjahr);
$bdate = mktime(0,0,0,$endemonat,$endetag,$endejahr);

$tage = ($bdate-$vdate)/86400;

for ($i = 0; $i < $tage; $i++) {
$testdate = mktime(0,0,0,$startmonat,$starttag+$i,$startjahr);
$test = date("Y-m-d",$testdate);
echo "$i: $test<br>";
}

Der Code liefert Dir allerdings um die Zeitumstellungsgrenzen anderes Verhalten.

1. Beispiel: Ohne Umstellung dazwischen:

$starttag = "25";  
$startmonat = "9";  
$startjahr = "2007";  
$endetag = "30";  
$endemonat = "9";  
$endejahr = "2007";

Ergibt:

0: 2007-09-25
1: 2007-09-26
2: 2007-09-27
3: 2007-09-28
4: 2007-09-29

2. Beispiel: Mit Umstellung Sommer- auf Winter dazwischen:

$starttag = "25";  
$startmonat = "10";  
$startjahr = "2007";  
$endetag = "30";  
$endemonat = "10";  
$endejahr = "2007";

Ergibt:

0: 2007-10-25
1: 2007-10-26
2: 2007-10-27
3: 2007-10-28
4: 2007-10-29
5: 2007-10-30

3. Beispiel: Mit Umstellung Winter- auf Sommerzeit dazwischen:

$starttag = "25";  
$startmonat = "3";  
$startjahr = "2008";  
$endetag = "30";  
$endemonat = "3";  
$endejahr = "2008";

Ergibt:

0: 2008-03-25
1: 2008-03-26
2: 2008-03-27
3: 2008-03-28
4: 2008-03-29

Im 2. Beispiel hast Du ein Datum mehr als in den anderen Fällen. Du kannst das Problem umgehen, indem Du round() durchführst:

$tage = round (($bdate-$vdate)/86400);

Dann funktioniert auch Deine Lösung in allen Fällen identisch.

Viele Grüße,
Christian