PHP рассчитывает количество полных месяцев между двумя датами

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

Например, у меня есть две даты: 2017-11-01 а также 2018-01-31
Что мне нужно в результате 3 месяца. Это означает, что между этими двумя датами есть 3 полных месяца выставления счетов.

Вот как это должно работать:

  • Месяц 1: 2017-11-01 до 2017-11-30
  • Месяц 2: 2017-12-01 до 2017-12-31
  • Месяц 3: 2018-01-01 до 2018-01-31

Я попробовал метод diff в классе DateTime, он производит что-то, что мало помогает. Вот пример

<?php
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00');
$diff = $date1->diff($date2);
print_r($diff)

result:
DateInterval Object
(
[y] => 0
[m] => 2
[d] => 30
[h] => 0
[i] => 0
[s] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 91
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

Показывает 2 месяца и 30 дней.

Однако в несколько ином сценарии

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-30 00:00:00');

Разница между этими двумя датами должна показывать 2 месяца и 30 дней, а не 3 месяца.

Любая помощь или идеи будут с благодарностью.

1

Решение

Добавьте один день к вашей дате окончания, прежде чем делать сравнение. Если исходная дата окончания была последним днем ​​месяца, то новая дата окончания переносится на следующий месяц, и вы получите правильное количество «полных» месяцев в объекте diff. Если оригинал был в любой день но последний день месяца, это не изменит результат.

$start = '2017-11-01';
$end = '2018-01-31';

$date1 = DateTime::createFromFormat('Y-m-d', $start);
$date2 = DateTime::createFromFormat('Y-m-d', $end)->add(new DateInterval('P1D'));

echo $date1->diff($date2)->m, "\n";
2

Другие решения

Кажется, вы потеряли один день во время расчета. Потому что вам нужен интервал в месяцах, включая первый / последний день — тогда вы должны добавить этот день к интервалу.

Итак, решение в этом случае будет:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 23:59:59');
$diff = $date1->diff($date2);

или же:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-10-31 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00');
$diff = $date1->diff($date2);

или даже:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-02-01 00:00:00');
$diff = $date1->diff($date2);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector