Расчет количества месяцев между датами - PullRequest
3 голосов
/ 13 августа 2010

Как бы вы рассчитали количество месяцев между двумя произвольными датами? Учитывая, что даже если на месяц приходится всего один день, он считается полным месяцем.

Примеры:

  • 2010-01-01 - 2010-03-31 = три месяца
  • 2010-06-15 - 2010-09-01 = четыре месяца

и так далее. Я думал просто разделить разницу между временными метками и 2592000 (среднее количество секунд в месяце), но это кажется хакерским и подверженным ошибкам. И я бы хотел сохранить его как можно быстрее (нужно запускать в тысячи раз быстрее), поэтому я думаю, что использование strtotime также не оптимально?

Ответы [ 2 ]

7 голосов
/ 13 августа 2010

Если я правильно читаю ваш вопрос, вы должны вернуть «2» для 31 января и 1 февраля, потому что он охватывает как январь, так и февраль, даже если они разнесены только на 1 день.

Вы могли бы потренироваться (psuedocode):

monthno1 = (date1_year * 12) + date1_month;
monthno2 = (date2_year * 12) + date2_month;

return (monthno2 - monthno1) + 1;

Предполагается, что вторая дата является более поздней.

1 голос
/ 13 августа 2010

Предполагая, что даты в известном формате:

function getMonths($start, $end) {
    $startParsed = date_parse_from_format('Y-m-d', $start);
    $startMonth = $startParsed['month'];
    $startYear = $startParsed['year'];

    $endParsed = date_parse_from_format('Y-m-d', $end);
    $endMonth = $endParsed['month'];
    $endYear = $endParsed['year'];

    return ($endYear - $startYear) * 12 + ($endMonth - $startMonth) + 1;
}

Это дает:

print(getMonths('2010-01-01', '2010-03-31')); // 3
print(getMonths('2010-06-15', '2010-09-01')); // 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...