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

<button type="button" id="btn" onclick=changeButtonText()>deliver me</button>

<script>

    function changeButtonText(){
    document.getElementById("btn").innerHTML = "GTFO";             
    }                       

</script>
12
задан Quasimodo's clone 12 December 2016 в 14:46
поделиться

3 ответа

Вы можете легко реализовать функцию "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
35
ответ дан 2 December 2019 в 04:09
поделиться

Необходимо быть осторожными, потому что даты имеют много пограничных случаев. Например, просто возврат месяца 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 методов документируются здесь .

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

0
ответ дан 2 December 2019 в 04:09
поделиться
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's 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);
1
ответ дан 2 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: