De manière élégante pour obtenir le nombre de mois entre deux dates?
Imaginons que j'ai deux dates variables, comme
$date1 = "2009-09-01";
$date2 = "2010-05-01";
J'ai besoin pour obtenir le nombre de mois entre $date2
et $date1
($date2 >= $date1
). I. e. j'ai besoin d'obtenir 8
.
Est-il un moyen de l'obtenir à l'aide date fonction, ou j'ai exploser mon chaînes et de faire quelques calculs?
Merci beaucoup
Vous devez vous connecter pour publier un commentaire.
Pour PHP >= 5.3
DateTime::diff renvoie une DateInterval objet
Si vous ne courez pas avec PHP 5.3 ou plus, je suppose que vous aurez à utiliser des timestamps unix :
Mais ce n'est pas très précis (il n'y a pas toujours de 30 jours par mois).
Dernière chose : si ces dates venir à partir de votre base de données, puis utilisez votre SGBD pour faire ce travail, pas de PHP.
Edit: Ce code doit être plus précis si vous ne pouvez pas utiliser DateTime::diff ou de votre SGBDR :
var_dump($d1->diff($d2)->m)
échouera vous dans la méthode DateTime (en haut de cette réponse), car il ne montre que les mois qui ne sont pas d'ajouter des années. Essayer cela et voir ce qui se passe:$d1 = new DateTime("2011-05-14");
$d2 = new DateTime("2013-02-02");
$d3 = $d1->diff($d2);
echo '<pre>'.print_r($d3,true).'</pre>';
Ou, si vous voulez le style procédural:
Mise à JOUR: Ajouté le bout de code de compte pour les années.
Ou un simple calcul donnerait :
Précis et fonctionne dans tous les cas.
Après les essais de tonnes de solutions, de mettre le tout dans un test unitaire, c'est ce que je sors avec:
Par exemple, il sera de retour (cas de test à partir de l'unité de test):
Avis: en Raison de l'arrondissement avec les jours, même une moitié d'un mois seront arrondis, ce qui peut conduire à des question si vous l'utilisez avec certains cas. Donc, NE PAS l'UTILISER pour de tels cas, il peut vous causer des problèmes.
Par exemple:
C'est une autre façon d'obtenir le nombre de mois entre deux dates:
J'utilise ceci:
À l'aide de DateTime, cela va vous donner une solution plus précise, pour un montant de mois:
Vous auriez encore besoin de gérer les restes de jours
$d3->d
si votre monde réel problème n'est pas aussi simple et coupé et sec, comme la question d'origine, où les deux dates sont sur le premier jour du mois.C'est une méthode simple que j'ai écrit dans ma classe, pour compter le nombre de mois impliqué dans deux dates :
J'ai utilisé cette et fonctionne dans toutes les conditions
Dans le cas où les dates sont une partie d'un jeu de résultats d'une requête mySQL, il est beaucoup plus facile d'utiliser le TIMESTAMPDIFF en fonction de vos calculs de date et vous pouvez spécifier le retour des unités par exemple.
Select TIMESTAMPDIFF(MONTH, start_date, end_date)months_diff from table_name
strtotime n'est pas très précis, il permet un nombre approximatif, il ne tient pas compte du nombre réel de jours du mois.
c'est mieux d'élever les dates pour un jour qui est toujours présent dans chaque mois.