This is literally how every sane API works in languages built by adults. For example, here’s what happens in Java:
java.time.LocalDate.of(2023, 3, 31)
> #object[java.time.LocalDate 0x2bc77260 "2023-03-31"]
java.time.LocalDate.of(2023, 3, 31).minusMonths(1)
> #object[java.time.LocalDate 0xac0dc15 "2023-02-28"]
java.time.LocalDate.of(2023, 3, 31).minusMonths(2)
> #object[java.time.LocalDate 0x44b9305f "2023-01-31"]
I have no idea where people get this notion that a month isn’t a defined size. Do people just not understand the concept of a month?
That’s precisely what I’d expect as well, and what APIs in languages like Java do.