Вы должны быть осторожны с арифметикой дат, потому что она не симметрична из-за неравномерной продолжительности месяцев, поэтому вам нужны правила для ее решения.Например, какая дата ровно за 6 месяцев до 31 августа?
Прежде чем ответить, рассмотрите:
- 28 февраля плюс 6 месяцев - 28 августа
- 1 марта плюс 6 месяцев1 сентября.
- Так какая дата составляет 6 месяцев до 29, 30 и 31 августа?Это 28 февраля или 1 марта?
Подобные проблемы возникают для любого последнего дня месяца, в котором месяц, предшествующий 6 месяцам, не имеет 31 дня.Должен ли предел быть 30-го числа месяца или 1-го числа следующего месяца?Когда вы ответили на этот вопрос, вы можете разработать алгоритм для предоставления правильного ответа, а затем код для его реализации.
Если вы хотите, чтобы в таких случаях была установлена дата окончания месяца 6 месяцевраньше вы можете проверить месяц, полученный в результате вычитания 6 месяцев, и, если это не 6, установить последний день предыдущего месяца, например,
function sixMonthsPrior(date) {
// Copy date so don't affect original
var d = new Date(date);
// Get the current month number
var m = d.getMonth();
// Subtract 6 months
d.setMonth(d.getMonth() - 6);
// If the new month number isn't m - 6, set to last day of previous month
// Allow for cases where m < 6
var diff = (m + 12 - d.getMonth()) % 12;
if (diff < 6) d.setDate(0)
return d;
}
// Helper to format the date
function formatDate(d) {
return d.toLocaleString(undefined, {day:'2-digit', month:'short', year:'numeric'});
}
// Tests
[ new Date(2018, 7,31), // 31 Aug 2018
new Date(2018, 8, 1), // 1 Sep 2018
new Date(2018,11,31), // 31 Dec 2018
new Date(2019, 2,31) // 31 Mar 2019
].forEach( d => console.log(formatDate(d) + ' => ' + formatDate(sixMonthsPrior(d))));
Если это не та логика, которую вы хотите применить, вам нужно сказать, что есть.
PS.Вы также можете реализовать вышеуказанную логику, просто сравнив даты начала и окончания (номер дня).Если они разные, то должно быть пролонгировано больше месяца, поэтому установите на 0.