2015-02-05 6 views
6

Wenn ich diesen Code verwenden, bekomme ich komische Ergebnisse:PHP Februar Datum: "2015-01-31" +1 Monat: "2015-03-30". Wie repariert man?

$datetime = new DateTime('2015-01-31'); 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 

ich diese:

2015-03-31 
2015-04-30 
2015-05-31 

Und nicht 2015-02-28.

Wie zu beheben?

+0

@all hinzuzufügen: Ist thi s ein echter Fehler? Dies ist eindeutig die Benutzerfreundlichkeit zu brechen und viele Anwendungen zu brechen. – Sliq

Antwort

0

Wenn Sie den letzten Tag des nächsten Monats erhalten möchten, können Sie:

$datetime->modify('last day of next month'); 
0

Fix it so.

$datetime = new DateTime('2015-01-31'); 
$datetime->modify('28 days'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 

Sie

2015-02-28 
2015-03-31 
2015-04-30 
+2

Sie sind Genie, wirklich !! GENIUS!!! GENIUS!!! –

+0

Nicht wirklich .. das funktioniert im Allgemeinen nicht. Nur wenn Sie bereits wissen, dass Sie mit Januar zu tun haben, und dann, warum verwenden Sie "DateTime", um Sie überhaupt zum Februar zu bringen? Viel besser, eine einfache Lösung zu wählen, die immer funktioniert und immer gleich aussieht, wie mopo gepostet hat. –

+0

Ich scherze, wenn ich sage, du bist Genie. –

3

Die Art und Weise DateTime Werke erhalten wird, erhöht + 1 month der Monatswert nach dem anderen, Sie 2015-02-31 geben. Da es im Februar nur 28 oder 29 Tage gibt, wird das zu den ersten Märztagen ausgewertet. Dann, wie Sie wissen, wird die Frage nach Y-m-t Ihnen den letzten Tag des März geben.

Da Sie bereits t mit dem letzten Tag des Monats zu erhalten, können Sie dieses Problem, indem beginnend mit einem Datum vermeiden, anstatt zu Beginn eines Monats fällt:

$datetime = new DateTime('2015-01-01'); 

Referenz : PHP DateTime::modify adding and subtracting months

0

Mit dieser Funktion können versuchen Monate bis ein Datetime-Objekt

/** 
* 
* @param \DateTime $date DateTime object 
* @param int $monthToAdd Months to add at time 
*/ 
function addMonth(\DateTime $date, $monthToAdd) 
{ 
    $year = $date->format('Y'); 
    $month = $date->format('n'); 
    $day = $date->format('d'); 

    $year += floor($monthToAdd/12); 
    $monthToAdd = $monthToAdd % 12; 
    $month += $monthToAdd; 
    if ($month > 12) { 
     $year ++; 
     $month = $month % 12; 
     if ($month === 0) { 
      $month = 12; 
     } 
    } 

    if (! checkdate($month, $day, $year)) { 
     $newDate = \DateTime::createFromFormat('Y-n-j', $year . '-' . $month . '-1'); 
     $newDate->modify('last day of'); 
    } else { 
     $newDate = \DateTime::createFromFormat('Y-n-d', $year . '-' . $month . '-' . $day); 
    } 
    $newDate->setTime($date->format('H'), $date->format('i'), $date->format('s')); 

    return $newDate->format('Y-m-d'); 
} 

echo addMonth(new \DateTime('2015-01-30'), 1); //2015-02-28 
echo addMonth(new \DateTime('2015-01-30'), 2); //2015-03-30 
echo addMonth(new \DateTime('2015-01-30'), 3); //2015-04-30