Как рассчитать дату в JavaScript за три месяца до сегодняшнего дня?
Я пытаюсь сформировать дату, которая находится за 3 месяца до текущей даты. Я получаю текущий месяц по приведенному ниже коду
var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;
можете ли вы, ребята, предоставить мне логику для расчета и формирования даты (объект Date тип данных) учитывая, что когда месяц январь (1), за 3 месяца до даты будет октябрь (10)?
13 ответов:
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());
Я рекомендую использовать библиотеку под названием Момент.js.
он хорошо протестирован, работает в кросс-браузере и на стороне сервера(я использую его как в угловых, так и в узловых проектах). Он имеет большую поддержку для локали даты.
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')
чтобы сделать вещи действительно простыми, вы можете использовать DateJS, библиотеку дат для JavaScript:
пример кода:
Date.today().add({ months: -1 });
Это должно обрабатывать сложение / вычитание, просто поместите отрицательное значение для вычитания и положительное значение для добавления. Это также решает проблему месячного кроссовера.
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; }
Если
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".может использоваться для любого количества времени, просто установите правильные кратные.
уже есть элегантный ответ, но я считаю, что его трудно читать, поэтому я сделал свою собственную функцию. Для моих целей мне не нужен отрицательный результат, но это не трудно изменить.
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; }
Мне нравится простота ответ 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.');
var d = new Date("2013/01/01"); console.log(d.toLocaleDateString()); d.setMonth(d.getMonth() + 18); console.log(d.toLocaleDateString());
"один лайнер" (на многих строках для легкого чтения)) должен быть помещен непосредственно в переменную:
var oneMonthAgo = new Date( new Date().getFullYear(), new Date().getMonth() - 1, new Date().getDate() );
var date=document.getElementById("date"); var d = new Date(); document.write(d + "<br/>"); d.setMonth(d.getMonth() - 6); document.write(d); if(d<date) document.write("lesser then 6 months"); else document.write("greater then 6 months");
в моем случае мне нужно было вычесть 1 месяц до текущей даты. Важной частью был номер месяца, поэтому ему все равно, в какой день текущего месяца вы находитесь, мне нужен был в прошлом месяце. Это мой код:
var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART) dateObj.setDate(1); //Set first day of the month from current date dateObj.setDate(-1); // Substract 1 day to the first day of the month //Now, you are in the last month console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)вычесть 1 месяц до фактической даты это не точно, поэтому на первом месте я устанавливаю первый день месяца (первый день любого месяца всегда является первым днем), а на втором месте я вычитаю 1 день, который всегда отправляет вас в последний месяц. Надеюсь помочь вам чувак.
var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART) dateObj.setDate(1); //Set first day of the month from current date dateObj.setDate(-1); // Substract 1 day to the first day of the month //Now, you are in the last month console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days: <!DOCTYPE html> <html> <body> <p>Click the button to display the date after changing the month.</p> <button onclick="myFunction()">Try it</button> <p id="demo"></p> <script> function myFunction() { var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017" var OneMonthBefore =new Date(d); OneMonthBefore.setMonth(d.getMonth(),0); if(OneMonthBefore.getDate() < d.getDate() ) { d.setMonth(d.getMonth(),0); }else { d.setMonth(d.getMonth()-1); } document.getElementById("demo").innerHTML = d; } </script> </body> </html>
Comments