sparh Posté 19 Septembre 2012 Posté 19 Septembre 2012 bonjour, je me casse la tête sur cette question qui parait simple mais qui ne l'est pas! Comment calculer la différence en mois entre deux date On trouve un peu partout des fonctions mais aucune ne fonctionne. Par exemple pour PHP 5.3 on a : $start = '2008-12-31';$end = '2009-12-30';$d1 = new DateTime($start);$d2 = new DateTime($end);var_dump($d1->diff($d2)->m); //renvoi 11 au lieu de 12 $start = '2008-12-31';$end = '2009-12-31';$d1 = new DateTime($start);$d2 = new DateTime($end);var_dump($d1->diff($d2)->m); //renvoi 0 au lieu de 12 Bref je ne trouve aucune fonction valide, en connaissez vous une ? merci d'avance
captain_torche Posté 19 Septembre 2012 Posté 19 Septembre 2012 Tes fonctions ont l'air de bien fonctionner : Pour la première, il n'y a effectivement que 11 mois complets entre les deux dates (11,99 certes). Pour la seconde, il y a effectivement ... 1 an et 0 mois entre les dates. Il faudra aussi travailler sur le nombre d'années (multipliées bien entendu par 12) pour obtenir un nombre de mois.
sparh Posté 19 Septembre 2012 Auteur Posté 19 Septembre 2012 Aaahhh, je n'avais pas bien compris le $d1->diff($d2)->m , merci de m'avoir aidé à comprendre. Finalement je me suis fait une petite fonction classique : function diff_en_mois_entre_deux_date($start,$end) {//$date_format = Y-m-dsscanf($start, "%4s-%2s-%2s", $annee, $mois, $jour);$a1 = $annee;$m1 = $mois;sscanf($end, "%4s-%2s-%2s", $annee, $mois, $jour);$a2 = $annee;$m2 = $mois;$dif_en_mois = ($m2-$m1)+12*($a2-$a1);return $dif_en_mois ;}
SStephane Posté 19 Septembre 2012 Posté 19 Septembre 2012 TU ne pourras pas compter sur PHP pour te calculer une différence en mois, le "mois" est une notion vague, 90 jours ça fait 2,90 ou 3,10 mois selon celui que tu choisis. Tu ne peux récupérer éventuellement que le nombre total de jours, qui reste une notion sure : $d1 = DateTime::createFromFormat('Y-m-d','2008-12-31');$d2 = DateTime::createFromFormat('Y-m-d','2010-05-22');var_dump($d1->diff($d2)->format('%a'));
sparh Posté 19 Septembre 2012 Auteur Posté 19 Septembre 2012 Mais ma fonction même plus 'roots' marche correctement (enfin selon mes tests) C'est pour utiliser dans le cadre d'un agenda et des taches répétitives. function diff_en_entre_deux_date($start,$end,$type='jour') {//$date_format = YYYY-m-d//$date_format = YYYY-m-dsscanf($start, "%4s-%2s-%2s", $annee, $mois, $jour);$a1 = $annee;$m1 = $mois;sscanf($end, "%4s-%2s-%2s", $annee, $mois, $jour);$a2 = $annee;$m2 = $mois;$start_time = strtotime($start);$end_time = strtotime($end);if($type == 'jour') { $diff = ($end_time - $start_time)/ 86400 ; // 86400 = 24*60*60} elseif($type == 'semaine') { $diff = floor(($end_time - $start_time) / 604800) ; // 604800 = 24*60*60*7} elseif($type == 'mois') { $diff = ($m2-$m1)+12*($a2-$a1);} elseif($type == 'annee') { $diff = $a2-$a1;}return $diff ;}
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant