Elegante Möglichkeit, die Anzahl der Monate zwischen zwei Daten zu ermitteln?

Lesezeit: 4 Minuten

Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
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.

Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
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)

DateTime::diff gibt a zurück DateInterval Objekt

Wenn Sie nicht mit PHP 5.3 oder höher arbeiten, müssen Sie wohl Unix-Zeitstempel verwenden:

$d1 = "2009-09-01";
$d2 = "2010-05-01";

echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8

Aber es ist nicht sehr genau (es gibt nicht immer 30 Tage pro Monat).

Letzte Sache: Wenn diese Daten aus Ihrer Datenbank stammen, verwenden Sie Ihr DBMS, um diese Aufgabe zu erledigen, nicht PHP.

Bearbeiten: Dieser Code sollte genauer sein, wenn Sie DateTime::diff oder Ihr RDBMS nicht verwenden können:

$d1 = strtotime("2009-09-01");
$d2 = strtotime("2010-05-01");
$min_date = min($d1, $d2);
$max_date = max($d1, $d2);
$i = 0;

while (($min_date = strtotime("+1 MONTH", $min_date)) <= $max_date) {
    $i++;
}
echo $i; // 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.

    – Vinzenz Savard

    31. August 2013 um 19:41 Uhr

1646082847 815 Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
Chuck Burgess

Oder, wenn Sie den prozeduralen Stil möchten:

$date1 = new DateTime("2009-09-01");
$date2 = new DateTime("2010-05-01");
$interval = date_diff($date1, $date2);
echo $interval->m + ($interval->y * 12) . ' months';

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.

    – Chuck Burgess

    1. April 2013 um 2:20 Uhr

Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
Mikrofon

Oder eine einfache Rechnung würde ergeben:

$numberOfMonths = abs((date('Y', $endDate) - date('Y', $startDate))*12 + (date('m', $endDate) - date('m', $startDate)))+1;

Präzise und funktioniert in allen Fällen.

  • 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


1646082848 398 Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
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);

1646082849 677 Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
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.

1646082849 391 Elegante Moglichkeit die Anzahl der Monate zwischen zwei Daten zu
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

892720cookie-checkElegante Möglichkeit, die Anzahl der Monate zwischen zwei Daten zu ermitteln?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy