2017-01-17 2 views
1

mon objectif est de calculer le nombre de mois entre deux dates, y compris le mois de départ. J'utilise cette fonction pour calculer.Fonction de calcul de différence entre datetime (mois)

function number_months($date1, $date2){ 
    $begin = new DateTime(date('Y-m-d', strtotime($date1))); 
    $end = new DateTime(date('Y-m-d', strtotime($date2))); 

    $diff = $end->diff($begin); 
    return ($diff->format('%y') * 12) + $diff->format('%m') + 1; 
} 

Dans la plupart des cas dans les travaux fins, mais lorsque les paramètres de la fonction sont par exemple:

$date1 = 2015-11-04 00:00:00 
$date2 = 2017-02-01 00:00:00 

Fonction retourne:

15 

devrait être 16. Qu'est-ce que je rate? J'ai repris ici sur Stackoverflow, j'ai essayé différentes implémentations de code fourni, mais le problème persiste.

Merci.

+0

ajouter un dans le résultat, il sera 16 alors., –

+0

Pourquoi faut-il être 16? (2015-11), 2015-12, 2016-01, 2016-02, 2016-03, 2016-04, 2016-05, 2016-06, 2016-07 »,« 2016-09 »,« 2016-10 »,« 2016-11 »,« 2016-12 »,« 2017-01 »est de __15__ mois) –

+0

Et pourquoi« $ begin » = new DateTime (date ('Ym-d', strtotime ($ date1))); Pourquoi ne pas simplement '$ begin = new DateTime ($ date1);'? –

Répondre

0

Le problème est que l'utilisateur va définir la date de début et de fin du projet. Et j'ai besoin de créer une entrée pour chaque mois que le projet va être défini. J'ai donc besoin du numéro 16 dans ce cas.

Grâce aux commentaires je me suis rendu compte que DateTime::diff() fonctionne en unités complètes quand il s'agit de années, mois et jours.

J'ai résolu mon problème en réglant la date de début et de fin au 1er du mois. Alors maintenant, ma fonction renvoie le nombre de mois entre deux dates, y compris le mois de début et de fin.

function number_months($date1, $date2){ 
    $begin = new DateTime(date('Y-m-d', strtotime($date1))); 
    $end = new DateTime(date('Y-m-d', strtotime($date2))); 

    $begin->modify('first day of this month')->setTime(12, 00); 
    $end->modify('first day of this month')->setTime(12, 00); 

    $diff = $end->diff($begin); 
    return ($diff->format('%y') * 12) + $diff->format('%m') + 1; 
} 
0
11-04 to 12-04 = 1 month. 
12-04 to 01-04 = 1 month. 
01-04 to 02-01 = 0 month. 
Result diff->format('%m') = 2. 

(diff- $> Format ('% y') * 12) + $ diff-> Format ('% m') + 1 = 1 * 12 + 2 + 1 = 15; C'est vrai.