Как рассчитать дату в JavaScript за три месяца до сегодняшнего дня? - PullRequest
124 голосов
/ 29 октября 2011

Я пытаюсь сформировать дату, которая за 3 месяца до текущей даты.Я получаю текущий месяц по следующему коду:

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

Можете ли вы, ребята, предоставить мне логику для вычисления и формирования даты (объект типа Date), учитывая, что когда месяц январь (1), за 3 месяца до даты будет октябрь (10)?

Ответы [ 14 ]

263 голосов
/ 29 октября 2011
var d = new Date();
d.setMonth(d.getMonth() - 3);

Это работает на январь.Запустите этот фрагмент:

var d = new Date("2012/01/14");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
21 голосов
/ 13 января 2016

Я рекомендую использовать библиотеку Moment.js.

Он хорошо протестирован, работает в разных браузерах и на стороне сервера (я использую его как в проектах Angular, так и в Node).Он имеет отличную поддержку дат локали.

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format() возвращает строковое представление даты в формате ISO 8601 .Вы также можете использовать его с пользовательским форматом даты, например так: .format('dddd, MMMM Do YYYY, h:mm:ss a')

7 голосов
/ 21 февраля 2016

Это должно обрабатывать сложение / вычитание, просто положите отрицательное значение для вычитания и положительное значение для сложения. Это также решает проблему пересечения месяцев.

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}
7 голосов
/ 29 октября 2011

Чтобы упростить задачу, вы можете использовать DateJS, библиотеку дат для JavaScript:

http://www.datejs.com/

Пример кода для вас:

Date.today().add({ months: -1 });
5 голосов
/ 15 июня 2017

«Один вкладыш» (на многих строках для удобства чтения), который нужно поместить непосредственно в переменную:

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);
3 голосов
/ 25 января 2017

Мне нравится простота ответа gilly3 , но пользователи, вероятно, будут удивлены тем, что месяц до 31 марта - 3 марта. Я решил внедрить версию, которая придерживается конца месяца, поэтомумесяц до 28, 29, 30 и 31 марта будет 28 февраля, когда это не високосный год.

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');
3 голосов
/ 29 октября 2011

Если метод setMonth, предлагаемый gilly3, не является тем, что вам нужно, подумайте:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

Может использоваться в течение любого промежутка времени, просто установите правильные коэффициенты.

1 голос
/ 09 февраля 2018

var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());
1 голос
/ 05 июля 2016

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

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }
0 голосов
/ 08 мая 2019
   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

Объявить переменную с текущей датой.затем, просто используя встроенную функцию setMonth, мы можем получить 3 месяца назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...