Когда вы добавляете 1 месяц к 2019-03-31
, PHP внутренне просто увеличивает значение месяца 03
до 04
.Результат 2019-04-31
.
Поскольку в апреле всего 30 дней, значение 2019-04-31
имеет то же значение, что и значение 2019-05-01
.И именно поэтому в результате вы получаете один месяц и ноль дней.
Класс DateInterval
имеет еще одно удобное свойство: days
вместо m
и d
.Он будет содержать общее количество дней между двумя датами, равное 31 (вам нужно добавить 31 день к 2019-03-31
, чтобы получить 2019-05-01
.
. Для этого значения вы можете реализовать свое собственноелогика, что такое «один месяц». Если вы определите его как «один месяц = 30 дней», это может быть ваш желаемый результат:
$start_date = new DateTime('31-03-2019');
$end_date = new DateTime('01-05-2019');
$diff = $start_date->diff($end_date);
$months = floor($diff->days / 30);
$days = $diff->days % 30;
echo "day: " . $days . " month: " . $months . "\n";