2015-10-27 10 views
6

Ich habe Probleme bei der Berechnung des letzten Tages der letzten 12 Monate.Letzter Tag der letzten Monate Berechnung falsch

Hier ist der Code, den ich mit:

for ($i = 0; $i <= 12; $i++) { 
     $start[] = date("Y-m-01", strtotime(date('Y-m-01')." -$i months")); 
     $end[] = date('Y-m-t', strtotime($start[$i]. -1*$i .' month')); 

     echo $start[$i] . " - " . $end[$i] . "<br/>"; 
    } 

Dies erzeugt:

2015-10-01 – 2015-10-31 
2015-09-01 – 2015-08-31 
2015-08-01 – 2015-06-30 
2015-07-01 – 2015-04-30 
2015-06-01 – 2015-02-28 
2015-05-01 – 2014-12-31 
2015-04-01 – 2014-10-31 
2015-03-01 – 2014-08-31 
2015-02-01 – 2014-06-30 
2015-01-01 – 2014-04-30 
2014-12-01 – 2014-02-28 
2014-11-01 – 2013-12-31 
2014-10-01 – 2013-10-31 

Beachten Sie, dass der letzte Tag für den Monat September nicht korrekt ist (es zeigt 31. August als letzter Tag). Dies geschieht für mehrere Monate.

Irgendwelche Ideen?

Antwort

5

Was ist das gewünschte Ergebnis? Ich nehme an, Sie versuchen nur die ersten und letzten Tage des Monats anzuzeigen? Ihr Code wird über $i iteriert. Also jedes Mal, wenn es iteriert, entfernt es 0 Monate, 1 Monat, 2, 3, 4, 5 usw.

Entfernen Sie einfach diesen Code vollständig. Y-m-t wird tun.

for ($i = 0; $i <= 12; $i++) { 
    $start[] = date('Y-m-01', strtotime(date('Y-m-01')." -$i months")); 
    $end[] = date('Y-m-t', strtotime($start[$i])); 

    echo $start[$i] . " - " . $end[$i] . "<br/>"; 
} 

Ergebnisse in

2015-10-01 - 2015-10-31 
2015-09-01 - 2015-09-30 
2015-08-01 - 2015-08-31 
2015-07-01 - 2015-07-31 
2015-06-01 - 2015-06-30 
2015-05-01 - 2015-05-31 
2015-04-01 - 2015-04-30 
2015-03-01 - 2015-03-31 
2015-02-01 - 2015-02-28 
2015-01-01 - 2015-01-31 
2014-12-01 - 2014-12-31 
2014-11-01 - 2014-11-30 
2014-10-01 - 2014-10-31 
1

gehe ich davon aus es wegen Ihrer Iteration ist während $end[] Einstellung. Dies scheint jedoch zu funktionieren:

for ($i = 0; $i <= 12; $i++) { 
    $start[] = date("Y-m-01", strtotime(date('Y-m-01')." - $i months")); 
    $end[] = date("Y-m-t",strtotime("last day of " . date("Y-m", strtotime($start[$i])))); 

    echo $start[$i] . " - " . $end[$i] . "\n"; 
} 

Oder wie @Christian Varga answered:

$end[] = date('Y-m-t', strtotime($start[$i])); 

Welche zurück:

2015-10-01 - 2015-10-31 
2015-09-01 - 2015-09-30 
2015-08-01 - 2015-08-31 
2015-07-01 - 2015-07-31 
2015-06-01 - 2015-06-30 
2015-05-01 - 2015-05-31 
2015-04-01 - 2015-04-30 
2015-03-01 - 2015-03-31 
2015-02-01 - 2015-02-28 
2015-01-01 - 2015-01-31 
2014-12-01 - 2014-12-31 
2014-11-01 - 2014-11-30 
2014-10-01 - 2014-10-31 

Example/Demo

Verwandte Themen