Для 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 :: дифф возвращает объект DateInterval
Если вы не работаете с PHP 5.3 или выше, я думаю, вы» необходимо использовать временные метки unix:
$d1 = "2009-09-01";
$d2 = "2010-05-01";
echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8
Но это не очень точный (нет всегда 30 дней в месяц).
Последняя вещь: если эти даты взяты из вашей базы данных, используйте вашу СУБД для выполнения этой работы, а не PHP.
Edit: Этот код должен быть более точным, если вы не можете использовать DateTime :: диф или РСУБД:
$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
Отличное решение на петле! Очень краткий и точный. Отлично сработано! +1 –
Если у вас есть две даты более чем на год, вы найдете 'var_dump ($ d1-> diff ($ d2) -> m)' приведет вас к отказу в методе DateTime (верхняя часть этого ответа), так как он будут отображаться только месяцы, которые не складываются до нескольких лет. Попробуйте это и посмотрите, что произойдет: '$ d1 = new DateTime (" 2011-05-14 ");' '$ d2 = new DateTime (" 2013-02-02 ");' '$ d3 = $ d1 -> diff ($ d2); ' ' echo '
'; ' – pathfinderНу, не так быстро ... опираясь на strtotime может дать вам головные боли. Сколько месяцев между 31.01.2011 и 28.02.2011? –