Как получить прошлый месяц?

320
02 ноября 2017, 08:35

Есть рабочий код, который, отнимает от сегодняшнего, 1 месяц somedate.setMonth(somedate.getMonth() - 1); и показывает прошлый, работает со всеми датами кроме,

если сегодня 31 число (31 марта, 31 мая, 31 июля, 31 октября, 31 декабря) и число дней предыдущего месяца меньше 31-го дня, то месяц остаётся прежним.

var somedate = new Date();
console.log(somedate);
somedate.setMonth(somedate.getMonth() - 1);
console.log(somedate);
somedate.setDate(1);
console.log(somedate);
document.getElementById("fromdateinput").value = (somedate).format("yyyy-mm-dd");

Tue Oct 31 2017 22:56:23 GMT+0300 (RTZ 2 (зима))

Sun Oct 01 2017 22:56:23 GMT+0300 (RTZ 2 (зима))

Sun Oct 01 2017 22:56:23 GMT+0300 (RTZ 2 (зима))

Я конечно могу создать исключения для этих дат, но хотелось бы разобраться, почему так получается и и есть ли другие способы решения.

Answer 1

Используя getMonth() - 1 Вы пытаетесь установить несуществующую дату, 31 сентября. Т.к. последнее число в сентябре 30, остается 1 день, который устанавливает следующую дату (getMonth() - 1) + 1 Day.

Чтобы избежать подобной проблемы используйте второй параметр, dayValue.

var somedate = new Date();
console.log(somedate);
somedate.setMonth(somedate.getMonth() - 1, 30);
console.log(somedate);
somedate.setDate(1);
console.log(somedate);

JsFiddle

UPD: для удобства можете создать массив с количеством дней в каждом месяце:

// пример для последних чисел месяца
var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var monthDaysV = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; //кол-во дней в месяцах високосного года
var somedate = new Date(2017, 09, 31);
var monthLeft = 1;
console.log(somedate);
var prev_month = somedate.getMonth() - monthLeft;
var year = (prev_month < 0) ? ( somedate.getFullYear() - 1 ) : somedate.getFullYear();
if(!((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{ //невисокосный год
  somedate.setMonth(prev_month, monthDays[prev_month]);
}
else
{ //високосный год
  somedate.setMonth(prev_month, monthDaysV[prev_month]);
}
console.log(somedate);
somedate.setDate(1);
console.log(somedate);

JsFiddle

READ ALSO
JS, что-то не так с циклом

JS, что-то не так с циклом

Не работает, пишет "undefined"Подскажите, пожалуйста, что не так

234
Рендер результата работы цикла

Рендер результата работы цикла

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

204
Не работает ScriptProcessorNode с OfflineContext

Не работает ScriptProcessorNode с OfflineContext

Не работает ScriptProcessorNode с OfflineContext

305
Добавление класса по клику + проверка на наличие класса и добавление класса другому div

Добавление класса по клику + проверка на наличие класса и добавление класса другому div

У меня немного запутанное задание: нужно чтобы при клике на inputinput-checkbox другому div

292