Para 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 devuelve un objeto DateInterval
Si usted no se quede con PHP 5.3 o superior, lo que supongo' tendré que usar marcas de tiempo unix:
$d1 = "2009-09-01";
$d2 = "2010-05-01";
echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8
Pero no es muy preciso (no hay siempre 30 días por mes).
Lo último: si esas fechas provienen de su base de datos, entonces use su DBMS para hacer este trabajo, no PHP.
Editar: Este código debe ser más precisa si no se puede utilizar DateTime :: diff o su RDBMS:
$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
¡Gran solución en el bucle while! Muy conciso y preciso. ¡Bien hecho! +1 –
Si tiene dos fechas con más de un año de diferencia, encontrará 'var_dump ($ d1-> diff ($ d2) -> m)' le fallará en el método DateTime (el más alto en esta respuesta) ya que solo mostrará los meses que no suman años. Pruebe esto y vea lo que sucede: '$ d1 = new DateTime (" 2011-05-14 ");' '$ d2 = new DateTime (" 2013-02-02 ");' '$ d3 = $ d1 -> diff ($ d2); ' ' echo '
'; ' – pathfinderBueno, no tan rápido ... confiar en strtotime puede darte dolores de cabeza. ¿Cuántos meses hay entre el 31.01.2011 y el 28.02.2011? –