Есть рабочий код, который, отнимает от сегодняшнего, 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 (зима))
Я конечно могу создать исключения для этих дат, но хотелось бы разобраться, почему так получается и и есть ли другие способы решения.
Используя 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени суток, в input пользователь вводит вопросы, по событие keyup каждый раз запускается функция которая сравнивает совпадения в вводе...
Не работает ScriptProcessorNode с OfflineContext
У меня немного запутанное задание: нужно чтобы при клике на inputinput-checkbox другому div