Месяцы - неудобный интервал для работы, потому что они не имеют фиксированной длины. Должен ли алгоритм предполагать, что под «1 месяцем» вы подразумеваете «30 дней» или «31 день», или он должен просто попытаться вычесть 1 из поля «месяц» в структуре даты?
Последний вариант это то, что происходит здесь: учитывая "2020-03-31", библиотека дат PHP вычитает 1 из "03", чтобы дать "2020-02-31". Поскольку это недопустимая дата (в феврале 2020 года было 29 дней), она «нормализует» ее до реальной даты - через 2 дня после того, как 29 февраля было 2 марта.
Возможно, вы хотите использовать более конкретную c период для вычитания, например, 30 дней - хотя учтите, что если в качестве исходного ввода указано «2020-03-01», это даст вам «2020-01-31», а не «2020-02-01».
В конечном счете, это проблема нашего неправильного календаря, а не PHP. Вам действительно нужно определить, что вы подразумеваете под «месяцем ранее», и использовать более конкретный c алгоритм, который учитывает это требование.