Jump to content
sparh

Différence en mois entre deux date

Rate this topic

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ;
}

Share this post


Link to post
Share on other 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'));

Share this post


Link to post
Share on other 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 ;
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...