Кажется, эта функция JavaScript Date.setMonth
делает то, для чего не предназначена. Вот фрагмент кода. В этом сценарии мы пытаемся получить последнюю дату каждого месяца.
var d = new Date(2018, 11, 31); // this would set it to Dec 31 2018
d.setMonth(d.getMonth() + 1); // this would set it to Jan 31 2019
d.setMonth(d.getMonth() + 1); // this would set it to March 03 2019
alert(d);
Итак, похоже, что функция set month просто добавила 30 дней к предыдущей дате (31 января 2019 года), что неоднозначно. Та же проблема может возникнуть в случае месяца с 30 днями.
Есть ли какой-нибудь обходной путь, который может дать нам точное решение этой проблемы, когда добавление месяцев просто изменит месяцы? и установить дату на последнюю дату, если она не существует?
Чтобы получить последнюю дату следующего месяца, используйте следующее:
var d = new Date(2018, 11, 31); // Dec 31 2018
d.setDate(1); // first day of current month
d.setMonth(d.getMonth() + 2); // add *two* months
d.setDate(0); // 0 makes the date roll back to previous month
d; // Jan 31 2019
Пытаться
new Date(d.getFullYear(), d.getMonth() + 1);
var d = new Date();
var d = new Date(d.getFullYear(), d.getMonth() + 1);
console.info(d); // last day
Для февраля 2019 года дата месяца находится в диапазоне от 1 до 28, но дата уже установлена как 31, поэтому для следующего месяца будет установлена дата 3, потому что 31-28 = 3. Для справки проверьте это.
Чтобы получить последнюю дату месяца, попробуйте следующее:
var d = new Date(2018, 11, 31); // Dec 31 2018
var last = new Date(d.getFullYear(), d.getMonth() + 2, 0);
console.info(last); // Jan 31 2019
last = new Date(d.getFullYear(), d.getMonth() + 3, 0);
console.info(last); // Feb 28 2019
это не поможет в случае февраля. Это неверно. он должен вернуться 28 февраля, если вы добавите к нему 2 месяца.
@MaulikModi Если новая дата месяца установлена на ноль (0), новая дата будет установлена на последний день предыдущего месяца.
Он не добавляет 30 дней, он просто меняет месяц. Тот факт, что результирующая дата (2019-02-31) преобразуется в 2019-03-03, полностью согласуется с тем, как объект Date обрабатывает переполненные даты.