Aller au contenu
sparh

Différence en mois entre deux date

Noter ce sujet :

Recommended Posts

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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
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 ;
}

Partager ce message


Lien à poster
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'));

Partager ce message


Lien à poster
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 ;
}

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×