Причина, по которой Date.new(2019, 9, 30) - 1.month
приводит к Fri, 30 Aug 2019
, заключается просто в том, что 1.month
- это не 30 дней, а статическое значение 2629746 секунд (30,436875 дней).
date = Date.new(2019, 9, 30)
1.month == 30.436875.days #=> true
date - 30.days #=> Sat, 31 Aug 2019
date - 30.436875.days #=> Fri, 30 Aug 2019
Вы можете найти этизадокументированы статические значения здесь .