DateTime :: diff возвращает неожиданный результат - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующий код, который возвращает неожиданный ответ.Пожалуйста, дайте мне знать, что не так.

$start_date  = new DateTime('31-03-2019');
$end_date    = new DateTime('01-05-2019');
$d = $start_date->diff($end_date);
echo "day: " . $d->d . " month: " . $d->m . "\n";

Он возвращает следующий вывод:

day: 0 month: 1

Я ожидаю, что вывод будет:

day: 1 month: 1

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Когда вы добавляете 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";
0 голосов
/ 01 марта 2019

Это даст вам один день и один месяц https://3v4l.org/q0T8r

$start_date  = new DateTime('31-03-2019 00:00:00');
$end_date    = new DateTime('01-05-2019 24:00:00');
$d = $start_date->diff($end_date);
echo "day: " . $d->d . " month: " . $d->m . "\n";
...