Пока сам с таким не столкнешься, глазам своим не поверишь. Такой баг сразу и не найдешь.
Многие базы данных корректно работают с датами. Если взять дату — 31.12.2017, и отнять от нее один месяц, то должна получиться дата — 30.11.2017:
db=# select '2017-12-31'::timestamp - interval '1 month' new_date; new_date --------------------- 2017-11-30 00:00:00 (1 строка)
MariaDB [(none)]> select '2017-12-31' - interval 1 month new_date; +------------+ | new_date | +------------+ | 2017-11-30 | +------------+ 1 row in set (0.00 sec)
Но php почему-то считает иначе:
$dt = date_create("2017-12-31"); $dt->modify("-1 month"); echo $dt->format('Y-m-d')."\n"; 2017-12-01
Интересно то, что разработчики php не считают такое поведение багом, а особенностью реализации алгоритма работы с датами.