it-swarm.com.de

Berechnen Sie die Anzahl der Monate zwischen zwei Daten in PHP?

Ohne die Funktion date_diff von PHP 5.3 (ich verwende PHP 5.2.17) gibt es eine einfache und genaue Möglichkeit, dies zu tun? Ich denke an so etwas wie den folgenden Code, weiß aber nicht, wie ich Schaltjahre erklären soll:

$days = ceil(abs( strtotime('2000-01-25') - strtotime('2010-02-20') ) / 86400);
$months = ???;

Ich versuche herauszufinden, wie viele Monate eine Person alt ist.

21
cronoklee
$date1 = '2000-01-25';
$date2 = '2010-02-20';

$ts1 = strtotime($date1);
$ts2 = strtotime($date2);

$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);

$month1 = date('m', $ts1);
$month2 = date('m', $ts2);

$diff = (($year2 - $year1) * 12) + ($month2 - $month1);

Vielleicht möchten Sie die Tage auch irgendwo angeben, je nachdem, ob Sie " ganze Monate" meinen oder nicht. Ich hoffe, du bekommst die Idee.

71
deceze

Dies ist eine einfache Methode, die ich in meiner Klasse geschrieben habe, um die Anzahl der Monate in zwei angegebenen Datumsangaben 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;
}
14
pollux1er

So was:

$date1 = strtotime('2000-01-25');
$date2 = strtotime('2010-02-20');
$months = 0;

while (($date1 = strtotime('+1 MONTH', $date1)) <= $date2)
    $months++;

echo $months;

Wenn Sie Tage bis einschließen möchten, verwenden Sie Folgendes:

$date1 = strtotime('2000-01-25');
$date2 = strtotime('2010-02-20');

$months = 0;

while (strtotime('+1 MONTH', $date1) < $date2) {
    $months++;
    $date1 = strtotime('+1 MONTH', $date1);
}

echo $months, ' month, ', ($date2 - $date1) / (60*60*24), ' days'; // 120 month, 26 days
2
Adam

Ich musste vor kurzem das Alter in Monaten berechnen, die von pränatal bis 5 Jahre alt waren (60+ Monate).

Keine der obigen Antworten funktionierte für mich ... Die erste, die ich ausprobiert habe, die im Grunde ein 1-Liner für die Antwort von Deceze ist

$bdate = strtotime('2011-11-04'); 
$edate = strtotime('2011-12-03');
$age = ((date('Y',$edate) - date('Y',$bdate)) * 12) + (date('m',$edate) - date('m',$bdate));
. . .

Dies schlägt mit den gesetzten Daten fehl, offensichtlich sollte die Antwort 0 sein, da die Monatsmarke (2011-12-04) noch nicht erreicht wurde, je nachdem, ob der Code 1 zurückgibt.

Die zweite Methode habe ich versucht, mit Adams Code

$bdate = strtotime('2011-01-03'); 
$edate = strtotime('2011-02-03');
$age = 0;

while (strtotime('+1 MONTH', $bdate) < $edate) {
    $age++;
    $bdate = strtotime('+1 MONTH', $bdate);
}
. . .

Dies schlägt fehl und sagt 0 Monate, wenn es 1 sein sollte.

Was für mich funktioniert hat, ist eine kleine Erweiterung dieses Codes. Was ich verwendet habe, ist folgendes:

$bdate = strtotime('2011-11-04');
$edate = strtotime('2012-01-04');
$age = 0;

if($edate < $bdate) {
    //prenatal
    $age = -1;
} else {
    //born, count months.
    while($bdate < $edate) {
        $age++;
        $bdate = strtotime('+1 MONTH', $bdate);
        if ($bdate > $edate) {
            $age--;
        }
    }
}
1
gattsbr

Hier ist meine Lösung. Sie prüft die Daten von Jahren und Monaten und stellt die Differenz fest.

 $date1 = '2000-01-25';
 $date2 = '2010-02-20';
 $d1=new DateTime($date2); 
 $d2=new DateTime($date1);                                  
 $Months = $d2->diff($d1); 
 $howeverManyMonths = (($Months->y) * 12) + ($Months->m);
1
NIKHIL PARIHAR
$date1 = '2000-01-25';
$date2 = '2010-02-20';

$ts1 = strtotime($date1);
$ts2 = strtotime($date2);

$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);

$month1 = date('m', $ts1);
$month2 = date('m', $ts2);

$diff = (($year2 - $year1) * 12) + ($month2 - $month1);

Wenn Month von Jan auf Feb umgestellt wurde, wird der Code $ diff = 1 .__ zurückgegeben. Wenn Sie jedoch den nächsten Monat erst nach 30 Tagen in Betracht ziehen möchten, fügen Sie die Codezeilen zusammen mit den obigen Zeilen hinzu.

$day1 = date('d', $ts1);
$day2 = date('d', $ts2);

if($day2 < $day1){ $diff = $diff - 1; }
0
Bhuvan Arora

Hier ist meine Lösung. Es werden nur Jahre und Monate von Daten geprüft. Wenn also ein Datum '31 .10.15 'und das andere '02 .11.15' ist, wird 1 Monat zurückgegeben.

function get_interval_in_month($from, $to) {
    $month_in_year = 12;
    $date_from = getdate(strtotime($from));
    $date_to = getdate(strtotime($to));
    return ($date_to['year'] - $date_from['year']) * $month_in_year -
        ($month_in_year - $date_to['mon']) +
        ($month_in_year - $date_from['mon']);
}
0
Evgeny

Folgen Sie der Antwort von @deceze (ich habe seine Antwort bestätigt). Der Monat wird immer noch als Ganzes gezählt, auch wenn der Tag des ersten Datums den Tag des zweiten Datums nicht erreicht hat.

Hier ist meine einfache Lösung für den Tag:

$ts1=strtotime($date1);
$ts2=strtotime($date2);

$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);

$month1 = date('m', $ts1);
$month2 = date('m', $ts2);

$day1 = date('d', $ts1); /* I'VE ADDED THE DAY VARIABLE OF DATE1 AND DATE2 */
$day2 = date('d', $ts2);

$diff = (($year2 - $year1) * 12) + ($month2 - $month1);

/* IF THE DAY2 IS LESS THAN DAY1, IT WILL LESSEN THE $diff VALUE BY ONE */

if($day2<$day1){ $diff=$diff-1; }

Die Logik sieht so aus: Wenn der Tag des zweiten Datums unter dem Tag des ersten Datums liegt, wird der Wert von $diff variabel um eins verringert.

0
Logan Wayne

Wie wäre es damit:

$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);
0
manix

meine Funktion, um das Problem zu lösen

function diffMonth($from, $to) {

        $fromYear = date("Y", strtotime($from));
        $fromMonth = date("m", strtotime($from));
        $toYear = date("Y", strtotime($to));
        $toMonth = date("m", strtotime($to));
        if ($fromYear == $toYear) {
            return ($toMonth-$fromMonth)+1;
        } else {
            return (12-$fromMonth)+1+$toMonth;
        }

    }
0
Khuat Huu Vinh