Получить объект даты (за шесть месяцев до) с другого объекта даты

Как создать объект даты, который меньше, чем n месяцев от другого объекта даты? Я ищу что-то вроде DateAdd().

Пример:

var objCurrentDate = new Date();

Теперь, используя objCurrentDate, как я могу создать объект Date с датой, которая на шесть месяцев старше сегодняшней даты/objCurrentDate?

Ответ 1

Вы можете легко реализовать функцию addMonths:

function addMonths(date, months) {
  date.setMonth(date.getMonth() + months);
  return date;
}


addMonths(new Date(), -6); // six months before now
// Thu Apr 30 2009 01:22:46 GMT-0600 

addMonths(new Date(), -12); // a year before now
// Thu Oct 30 2008 01:20:22 GMT-0600

Ответ 2

var oldDate:Date = new Date();
/*
 Check and adjust the date -
 At the least, make sure that the getDate() returns a 
 valid date for the calculated month and year.
 If it not valid, change the date as per your needs.
 You might want to reset it to 1st day of the month/last day of the month
 or change the month and set it to 1st day of next month or whatever.
*/
if(oldDate.getMonth() < n)
    oldDate.setFullYear(oldDate.getFullYear() - 1);
oldDate.setMonth((oldDate.getMonth() + n) % 12);

Ответ 3

Создайте объект даты и передайте значение n, где n - число (добавление/под) месяца.

  var dateObj = new Date();
  var requiredDate= dateObj.setMonth(dateObj.getMonth() - n);

Ответ 4

Вы должны быть осторожны, потому что даты имеют много крайних случаев. Например, простое изменение месяца назад на 6 не учитывает различное количество дней в каждом месяце. Например, если вы запускаете функцию вроде:

function addMonths(date, months) {
date.setMonth((date.getMonth() + months) % 12);
return date;
}

addMonths(new Date(2020, 7, 31), -6); //months are 0 based so 7 = August

Итоговая дата возвращения будет 31 февраля 2020 года. Вам необходимо учитывать разницу в количестве дней в месяце. Другие ответы предлагали это по-разному, перемещая его на первое число месяца или на последнее число месяца, или на первое число следующего месяца и т.д. Другой способ справиться с этим - сохранить дату, если она действительна. или переместить его в конец месяца, если он переполняет регулярные даты месяца. Вы можете написать это так:

function addMonths(date, months) {
  var month = (date.getMonth() + months) % 12;
  //create a new Date object that gets the last day of the desired month
  var last = new Date(date.getFullYear(), month + 1, 0);

  //compare dates and set appropriately
  if (date.getDate() <= last.getDate()) {
    date.setMonth(month);
  }

  else {
    date.setMonth(month, last.getDate());
  }

  return date;
}

Это по крайней мере гарантирует, что выбранный день не будет "переполнен" месяцем, в который он перемещается. Поиск последнего дня месяца с помощью метода datePart = 0 задокументировано здесь.

Эта функция все еще оставляет желать лучшего, так как она не добавляет лет, и вы не можете вычесть больше года (или вы столкнетесь с новой проблемой с включенными негативами). Однако исправление этих и других проблем, с которыми вы можете столкнуться (а именно часовых поясов), останется в качестве упражнения для читателя.