2017-01-17 6 views
1

Моя цель - рассчитать количество месяцев между двумя датами, включая начальный месяц.Функция расчета разницы между датой (месяцами)

Я использую эту функцию для расчета.

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; 
} 

В большинстве случаев в работает отлично, но когда параметры функции, например:

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

Функция возвращает:

15 

16 Должно быть. Что мне не хватает? Я снова собрал здесь на Stackoverflow, попробовал различные реализации предоставленного кода, но проблема все еще сохраняется.

Спасибо.

+0

добавить один в результат будет 16, то –

+0

Зачем это должно быть 16? ('2015-11',' 2015-12', '2016-01',' 2016-02', '2016-03';' 2016-04'; '2016-05';' 2016-06'; ' 2016-07'; '2016-08';' 2016-09'; '2016-10';' 2016-11'; '2016-12';' 2017-01' - __15__ месяца) –

+0

И почему '$ begin = new DateTime (дата ('Ym-d', strtotime ($ date1))); '? Почему бы не просто '$ begin = new DateTime ($ date1);'? –

ответ

0

Проблема в том, что пользователь установит дату начала и окончания проекта. И мне нужно создать вход для каждого месяца, когда проект будет установлен. Поэтому в этом случае мне нужен номер 16.

Благодаря комментариям я понял, что DateTime::diff() работает в полном объеме, когда дело доходит до лет, месяцев и дней.

Я решил проблему, установив дату начала и окончания на 1-е число месяца. Итак, теперь моя функция возвращает количество месяцев между двумя датами, включая начальный и конечный месяц.

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-> Формат ('% у') * 12) + $ diff-> Формат ('% м) + 1 = 1 * 12 + 2 + 1 = 15; Это правда.

 Смежные вопросы

  • Нет связанных вопросов^_^