var d = new Date();
d.setMonth(d.getMonth() - 3);
Це працює за січень. Запустіть цей фрагмент:
var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
Є деякі застереження ...
Місяць - це цікаво. Як Ви визначаєте 1 місяць? 30 днів? Більшість людей скажуть, що місяць тому означає той самий день місяця за необхідним цитуванням попереднього місяця . Але більше половини часу, тобто 31 день тому, а не 30. І якщо сьогодні 31 число місяця (а це не серпень чи декабер), цього місяця не існує в попередньому місяці.
Цікаво, що Google погоджується з JavaScript, якщо ви запитаєте його, який день на місяць раніше, ніж наступний день :

Там також сказано, що один місяць триває 30,4167 днів :

Отже, чи є місяць до 31 березня того ж дня, що і один місяць до 28 березня, на 3 дні раніше? Все це залежить від того, що ви маєте на увазі під "місяцем раніше". Ідіть, поспілкуйтеся з власником продукту.
Якщо ви хочете зробити так, як робить momentjs, і виправити ці помилки в останній день місяця, перейшовши на останній день місяця, ви можете зробити щось подібне:
const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());
Якщо ваші вимоги складніші, скористайтеся математикою і напишіть код. Ви розробник! Вам не потрібно встановлювати бібліотеку! Вам не потрібно копіювати та вставляти з stackoverflow! Ви можете розробити код самостійно, щоб зробити саме те, що вам потрібно!