Después de probar un montón de soluciones, poniendo todo en una prueba de unidad, esto es lo que yo salga con:
/**
* Calculate the difference in months between two dates (v1/18.11.2013)
*
* @param \DateTime $date1
* @param \DateTime $date2
* @return int
*/
public static function diffInMonths(\DateTime $date1, \DateTime $date2)
{
$diff = $date1->diff($date2);
$months = $diff->y * 12 + $diff->m + $diff->d/30;
return (int) round($months);
}
Por ejemplo, se volverá (casos de prueba de la prueba de la unidad):
- 01.11.2013 - 30.11.2013 - 1 mes
- 01.01.2013 - 31.12.2013 - 12 meses
- 31.01.2011 - 28.02.2011 - 1 mes
- 01/09/2009 hasta 01/05/2010 - 8 meses
- 01.01.2013 - 31.03.2013 - 3 meses
- 15.02.2013 - 15.04.2013 - 2 meses
- 01.02.1985 - 31.12.2013 - 347 meses
Aviso: Debido al redondeo con los días, incluso se redondeará la mitad de un mes, lo que puede ocasionar problemas si lo usa en algunos casos. Así que NO lo use para tales casos, le causará problemas.
Por ejemplo:
- 02.11.2013 - 31.12.2013 volverá 2, no 1 (como se esperaba).
¿Qué es exactamente un mes en este caso? El mes calendario? ¿30 dias? –
Duplicados: http://stackoverflow.com/search?q=date+difference+php – Gordon