Я пытаюсь посчитать разницу в месяцах между двумя датами, но более конкретно.
Например, у меня есть две даты: 2017-11-01 а также 2018-01-31
Что мне нужно в результате 3 месяца. Это означает, что между этими двумя датами есть 3 полных месяца выставления счетов.
Вот как это должно работать:
Я попробовал метод 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 месяца.
Любая помощь или идеи будут с благодарностью.
Добавьте один день к вашей дате окончания, прежде чем делать сравнение. Если исходная дата окончания была последним днем месяца, то новая дата окончания переносится на следующий месяц, и вы получите правильное количество «полных» месяцев в объекте 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";
Кажется, вы потеряли один день во время расчета. Потому что вам нужен интервал в месяцах, включая первый / последний день — тогда вы должны добавить этот день к интервалу.
Итак, решение в этом случае будет:
$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);