Pour 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 retourne un objet DateInterval
Si vous ne vous précipitiez pas avec PHP 5.3 ou plus, je suppose que vous » Il faudra utiliser un horodatage unix:
$d1 = "2009-09-01";
$d2 = "2010-05-01";
echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8
Mais ce n'est pas très précis (il n'y a pas toujours 30 jours par mois). Dernière chose: si ces dates proviennent de votre base de données, utilisez votre SGBD pour faire ce travail, pas PHP.
Edit: Ce code devrait être plus précis si vous ne pouvez pas utiliser DateTime :: diff ou SGBDR:
$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
Grande solution sur la boucle while! Très concis et précis. Bien joué! +1 –
Si vous avez deux dates distantes de plus d'un an, vous verrez 'var_dump ($ d1-> diff ($ d2) -> m)' échouera dans la méthode DateTime (la plus haute sur cette réponse) car elle ne montrera que les mois qui ne correspondent pas aux années. Essayez ceci et voyez ce qui se passe: '$ d1 = nouveau DateTime (" 2011-05-14 ");' '$ d2 = nouveau DateTime (" 2013-02-02 ");' '$ d3 = $ d1 -> diff ($ d2); 'echo '
';' – pathfinderEh bien pas si vite ... compter sur strtotime peut vous donner des maux de tête. Combien de mois se situent entre le 31.01.2011 et le 28.02.2011? –