Aller au contenu

Différence en mois entre deux date


sparh

Sujets conseillés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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-d
sscanf($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 ;
}

Lien vers le commentaire
Partager sur d’autres sites

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'));

Lien vers le commentaire
Partager sur d’autres sites

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-d
sscanf($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 ;
}

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...