Вот и доказательство
Мой вариант даст 9 мес. 9 дней на твоем счетчике, перескока не будет
Код:
$timer_since = new DateTime('2018-05-04');
$now = new DateTime('now');
$now->modify('-15day');
for ($x = 0; $x <= 31; $x++) {
$now->modify('+1day');
print($now->format("Дата: Y-M-d "));
$date_diff = $now->diff($timer_since);
print($date_diff->format("Старый вариант: %Y год %M месяц %D день."));
$date_diff = $timer_since->diff($now);
print($date_diff->format(" Новый вариант: %Y год %M месяц %D день \xA"));
}
Запусти этот простой скрипт и проверь вывод в консоль :)
ок. если отказаться от процедурного спагетти-кода примера (сдвиги дат какие-то) и вернуться в 2019 год к ООП, то имеем следующее:
Код:
echo (new DateTime())
->setDate(2018,5,21)
->diff(new DateTime())
->format('%Y years, %m months, %d days')."\n";
echo (new DateTime())
->diff((new DateTime())->setDate(2018,5,21))
->format('%Y years, %m months, %d days')."\n";
да, если объект, на который применяется метод находится в прошлом, то все получаем верно, для моей даты 9мес и 9 дней. Если меняем местами и инициализируемый объект находится в будущем, то имеем на выходе во втором случае 9 мест и 12 дней.
Если посмотреть, что за объект DateInterval возвращается нам в обеих случаях, то видим, что проперти days у него одинаковое - 285.
Кроме того во втором случае мы имеем на выходе проперти объекта invert=1, что говорит нам, что отсчет производился в обратную сторону. И там уже diff, как и говорилось, неверно считает (округляет) дни из-за усреднения дней в месяцах в своем алгоритме (этот факт известен). Посему при таком использовании нужно учитывать значение invert и соответственно каким-то образом форматировать вывод на основе проперти days объекта DateInterval (еще раз замечу, в обоих случаях они одинаковы, что логично и что имелось ввиду при утверждении о перестановке порядка вызова).
Но по сути в данном конкретном случае реализации счетчика на форуме ты прав, порядок при таком форматировании вывода должен учитываться. Но это решение не оптимально в свете актуальных стандартов ООП PHP 7.3. К тому же я, например, не уверен, что алгоритм всегда правильно округляет, даже при первом варианте использования.
Ладно, итак много слов потратил, надеюсь, самое главное - баг счетчика на форуме наконец-то пофиксят :)
p.s. рекомендую:
Robert C. Martin
"Clean Code. A Handbook of Agile Software Craftsmanship."