Как рассчитать дату в JavaScript за три месяца до сегодняшнего дня?
Я пытаюсь создать дату, которая за 3 месяца до текущей даты. Я получаю текущий месяц по приведенному ниже коду
var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;
Можете ли вы, ребята, предоставить мне логику расчета и формирования даты (объект типа данных Date
), учитывая, что, когда месяц январь (1), за 3 месяца до даты будет OCtober (10)?
Ответы
Ответ 1
var d = new Date();
d.setMonth(d.getMonth() - 3);
Это работает на январь. Запустите этот фрагмент:
var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
Ответ 2
Я рекомендую использовать библиотеку 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')
Ответ 3
Чтобы сделать вещи очень простыми, вы можете использовать DateJS, библиотеку дат для JavaScript:
http://www.datejs.com/
Пример кода для вас:
Date.today().add({ months: -1 });
Ответ 4
Это должно обрабатывать сложение/вычитание, просто положите отрицательное значение для вычитания и положительное значение для добавления. Это также решает проблему кроссовера месяца.
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;
}
Ответ 5
A "один лайнер" (на многих линиях для простого чтения)), который должен быть помещен непосредственно в переменную:
var oneMonthAgo = new Date(
new Date().getFullYear(),
new Date().getMonth() - 1,
new Date().getDate()
);
Ответ 6
Если метод 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".
Может использоваться в любое время, просто установите правильные кратные.
Ответ 7
Мне нравится простота gilly3 answer, но пользователи, вероятно, будут удивлены тем, что за месяц до 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.');
Ответ 8
Уже есть изящный ответ, но я считаю, что его трудно читать, поэтому я сделал свою собственную функцию. Для моих целей мне не нужен отрицательный результат, но его было бы непросто изменить.
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;
}
Ответ 9
var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());
Ответ 10
var minDate = new Date();
minDate.setMonth(minDate.getMonth() - 3);
Объявите переменную с текущей датой. затем, просто используя встроенную функцию setMonth, мы можем получить 3 месяца назад.
Ответ 11
В моем случае мне нужно было вычесть 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)
Substract 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)
Ответ 12
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");
Ответ 13
Передайте объект JS Date и целое число месяцев, которые вы хотите добавить/вычесть. monthsToAdd
может быть положительным или отрицательным. Возвращает объект даты JS.
Если ваш originalDateObject
- 31 марта, и вы передаете -1 как monthsToAdd
, то ваша дата выхода будет 28 февраля.
Если вы проведете большое количество месяцев, скажем, 36, оно также будет корректно корректировать год.
const addMonthsToDate = (originalDateObject, monthsToAdd) => {
const originalDay = originalDateObject.getUTCDate();
const originalMonth = originalDateObject.getUTCMonth();
const originalYear = originalDateObject.getUTCFullYear();
const monthDayCountMap = {
"0": 31,
"1": 28,
"2": 31,
"3": 30,
"4": 31,
"5": 30,
"6": 31,
"7": 31,
"8": 30,
"9": 31,
"10": 30,
"11": 31
};
let newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
let newDay;
if (originalDay > monthDayCountMap[newMonth]) {
newDay = monthDayCountMap[newMonth].toString();
} else {
newDay = originalDay.toString();
}
newMonth = (+newMonth + 1).toString();
if (newMonth.length === 1) {
newMonth = '0' + newMonth;
}
if (newDay.length === 1) {
newDay = '0' + newDay;
}
if (monthsToAdd <= 0) {
monthsToAdd -= 11;
}
let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;
let newTime = originalDateObject.toISOString().slice(10, 24);
const newDateISOString = '${newYear}-${newMonth}-${newDay}${newTime}';
return new Date(newDateISOString);
};
Ответ 14
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>
Ответ 15
var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);