Javascript Дата: в следующем месяце

Я использую Javascript Date для проекта, но сегодня заметил, что мой код, который ранее работал, более не работает корректно. Вместо того, чтобы производить февраль, как ожидается, код ниже дает март.

Мой код выглядит примерно так:

current = new Date();
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now

Этот код работал каждый день до сегодняшнего дня. Является ли это ошибкой Javascript, или я об этом неправильно?

Ответ 1

Вероятно, вы установили дату до 31 февраля 2009 года (если сегодня 31 января), а Javascript автоматически перевернет ее в начале марта.

Проверьте день месяца, я ожидаю, что это будет 1, 2 или 3. Если это не то же самое, что и до того, как вы добавили месяц, откат назад на один день до тех пор, пока месяц не изменится.

Таким образом, день "последний день января" становится "последним днем ​​февраля".

EDIT:

Ronald, основываясь на ваших комментариях к другим ответам, вы, возможно, захотите избегать поведения в крайнем случае, например, "что происходит, когда я пытаюсь сделать 30 февраля" или "что происходит, когда я пытаюсь сделать 2009/13/07 (yyyy/mm/dd)" (последнее может быть проблемой даже для моего решения, поэтому вы должны проверить его).

Вместо этого я бы явно указал на возможности. Поскольку вас не волнует день месяца (вы просто хотите, чтобы год и месяц были правильными для следующего месяца), что-то вроде этого должно быть достаточно:

var now = new Date();
if (now.getMonth() == 11) {
    var current = new Date(now.getFullYear() + 1, 0, 1);
} else {
    var current = new Date(now.getFullYear(), now.getMonth() + 1, 1);
}

Это дает вам 1 января следующего года в любой день в декабре и в первый день следующего месяца в любой другой день. Больше кода, я знаю, но я давно устал от кодовых трюков за эффективность, предпочитая читаемость, если нет четкого требования делать иначе.

Ответ 2

Вместо этого попробуйте:

var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);

Ответ 3

Я искал простое однострочное решение для получения следующего месяца с помощью математики, поэтому мне не нужно было искать функции даты javascript (умственная лень с моей стороны). Как ни странно, я не нашел его здесь.

Я преодолел свой короткий бой лени, написал один и решил поделиться!

Решение:

(new Date().getMonth()+1)%12 + 1

Чтобы было ясно, почему это работает, позвольте мне сломать магию!

Он получает текущий месяц (который находится в формате 0..11), увеличивается на 1 в течение следующего месяца и переносит его на границу 12 через модуль (11% 12 == 11; 12% 12 == 0). Это возвращает следующий месяц в том же формате 0..11, поэтому преобразование в формат Date() будет распознавать (1..12) легко: просто добавьте 1 снова.

Доказательство концепции:

> for(var m=0;m<=11;m++) { console.info( "next month for %i: %i", m+1, (m+1)%12 + 1 ) }
next month for 1: 2
next month for 2: 3
next month for 3: 4
next month for 4: 5
next month for 5: 6
next month for 6: 7
next month for 7: 8
next month for 8: 9
next month for 9: 10
next month for 10: 11
next month for 11: 12
next month for 12: 1

Итак, у вас есть это.

Ответ 4

Вы можете использовать библиотеку date.js:

http://code.google.com/p/datejs/

И просто сделайте это

Date.today().next().month();

У вас будет точное значение на сегодняшний день + 1 месяц (включая дни)

Ответ 5

Если вы используете moment.js, у них есть функция add. Здесь ссылка - https://momentjs.com/docs/#/manipulating/add/

moment().add(7, 'months');

Я также написал рекурсивную функцию, основанную на ответе paxdiablo, чтобы добавить переменное число месяцев. По умолчанию эта функция добавит месяц к текущей дате.

function addMonths(after = 1, now = new Date()) {
        var current;
        if (now.getMonth() == 11) {
            current = new Date(now.getFullYear() + 1, 0, 1);
        } else {
            current = new Date(now.getFullYear(), now.getMonth() + 1, 1);            
        }
        return (after == 1) ? current : addMonths(after - 1, new Date(now.getFullYear(), now.getMonth() + 1, 1))
    }

Пример

console.log('Add 3 months to November', addMonths(3, new Date(2017, 10, 27)))

Выход -

Add 3 months to November Thu Feb 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)

Ответ 6

попробуйте следующее:

var a = screen.Data.getFullYear();
var m = screen.Data.getMonth();
var d = screen.Data.getDate();

m = m + 1;
screen.Data = new Date(a, m, d);

if (screen.Data.getDate() != d)
screen.Data = new Date(a, m + 1, 0);

Ответ 7

ах, красота троянов:

const now = new Date();
const expiry = now.getMonth() == 11 ? new Date(now.getFullYear()+1, 0 , 1) : new Date(now.getFullYear(), now.getMonth() + 1, 1);

просто более простая версия решения, предоставляемая @paxdiablo и @Tom