Elegante Möglichkeit, die Anzahl der Monate zwischen zwei Daten zu ermitteln?
Lesezeit: 4 Minuten
Simon
Nehmen wir an, ich habe zwei Daten in Variablen, wie z
$date1 = "2009-09-01";
$date2 = "2010-05-01";
Ich brauche die Anzahl der Monate dazwischen $date2 und $date1($date2 >= $date1). Dh ich muss bekommen 8.
Gibt es eine Möglichkeit, es zu bekommen, indem man verwendet Datum Funktion, oder muss ich meine Zeichenfolgen explodieren und die erforderlichen Berechnungen durchführen?
Danke.
Vinzenz Savard
Für PHP >= 5.3
$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-05-01");
var_dump($d1->diff($d2)->m); // int(4)
var_dump($d1->diff($d2)->m + ($d1->diff($d2)->y*12)); // int(8)
Tolle Lösung für die While-Schleife! Sehr prägnant und genau. Gut gemacht! +1
– Chuck Burgess
20. November 2010 um 16:40 Uhr
Wenn Sie zwei Termine haben, die mehr als ein Jahr auseinander liegen, werden Sie finden var_dump($d1->diff($d2)->m) wird Sie in der DateTime-Methode (die oberste in dieser Antwort) scheitern lassen, da nur die Monate angezeigt werden, die sich nicht zu Jahren summieren. Versuchen Sie dies und sehen Sie, was passiert: $d1 = new DateTime("2011-05-14");$d2 = new DateTime("2013-02-02");$d3 = $d1->diff($d2);echo '<pre>'.print_r($d3,true).'</pre>';
– Pfadfinder
30. März 2013 um 5:56 Uhr
Nun, nicht so schnell … sich auf strtotime zu verlassen, kann Ihnen Kopfschmerzen bereiten. Wie viele Monate liegen zwischen dem 31.01.2011 und dem 28.02.2011?
– Valentin Despa
13. Juni 2013 um 8:16 Uhr
Dies funktioniert nicht, für das von Ihnen bereitgestellte Beispiel wird 5 und nicht 8 zurückgegeben
– Pez Cuckow
30. August 2013 um 19:38 Uhr
@PezCuckow: Ich habe es gerade nochmal getestet. Sie funktionieren alle korrekt.
AKTUALISIEREN: Codebit hinzugefügt, um die Jahre zu berücksichtigen.
Wenn Ihre Daten mehr als ein Jahr auseinander liegen, schlägt dies fehl. Sie müssten die Jahre * 12 zu Ihrer Antwort hinzufügen, um die Monate zu erhalten.
– Pfadfinder
30. März 2013 um 6:01 Uhr
Richtig bist du. Aktualisiert, um die möglichen Jahresspannen zu berücksichtigen.
Das ist großartig, außer dass es immer um 1 ausgeschaltet ist. Entfernen Sie das “+1” am Ende! 😀
– Supercoolville
2. August 2015 um 20:16 Uhr
Das ist genau das, was ich brauche (mit dem +1 am Ende). Es gibt Ihnen die betroffene Anzahl von Monaten. zB vom 29.10.2018 bis 31.12.2018 sind 3 Monate betroffen.
– Martin
16. Oktober 2018 um 19:27 Uhr
Jesus Velázquez
Dies ist eine weitere Möglichkeit, die Anzahl der Monate zwischen zwei Daten zu ermitteln:
// Set dates
$dateIni = '2014-07-01';
$dateFin = '2016-07-01';
// Get year and month of initial date (From)
$yearIni = date("Y", strtotime($dateIni));
$monthIni = date("m", strtotime($dateIni));
// Get year an month of finish date (To)
$yearFin = date("Y", strtotime($dateFin));
$monthFin = date("m", strtotime($dateFin));
// Checking if both dates are some year
if ($yearIni == $yearFin) {
$numberOfMonths = ($monthFin-$monthIni) + 1;
} else {
$numberOfMonths = ((($yearFin - $yearIni) * 12) - $monthIni) + 1 + $monthFin;
}
Ich benutze das:
$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-09-01");
$months = 0;
$d1->add(new \DateInterval('P1M'));
while ($d1 <= $d2){
$months ++;
$d1->add(new \DateInterval('P1M'));
}
print_r($months);
Pfadfinder
Mit DateTime erhalten Sie eine genauere Lösung für eine beliebige Anzahl von Monaten:
$d1 = new DateTime("2011-05-14");
$d2 = new DateTime();
$d3 = $d1->diff($d2);
$d4 = ($d3->y*12)+$d3->m;
echo $d4;
Sie müssten immer noch die verbleibenden Tage bewältigen $d3->d wenn Ihr reales Problem nicht so einfach und trocken ist wie die ursprüngliche Frage, bei der beide Daten auf den Ersten des Monats fallen.
pollux1er
Dies ist eine einfache Methode, die ich in meiner Klasse geschrieben habe, um die Anzahl der beteiligten Monate in zwei gegebene Daten zu zählen:
public function nb_mois($date1, $date2)
{
$begin = new DateTime( $date1 );
$end = new DateTime( $date2 );
$end = $end->modify( '+1 month' );
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($begin, $interval, $end);
$counter = 0;
foreach($period as $dt) {
$counter++;
}
return $counter;
}
Ich gebe ihm zwar +1, da dies am nächsten kommt, um echte Ergebnisse zu erzielen. Noch ist es nicht vollständig, da es für Termine im selben Monat ausfallen wird.
– Mujnoi Gyula Tamas
21. Dezember 2016 um 20:50 Uhr
8927200cookie-checkElegante Möglichkeit, die Anzahl der Monate zwischen zwei Daten zu ermitteln?yes