Дата JavaScript: в следующем месяце - PullRequest
34 голосов
/ 01 февраля 2009

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

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

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

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

Ответы [ 8 ]

47 голосов
/ 01 февраля 2009

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

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

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

EDIT:

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

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

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 января следующего года для любого дня декабря и первого дня следующего месяца для любого другого дня. Я знаю больше кода, но я уже давно устал от уловок кодирования для повышения эффективности, предпочитая удобочитаемость, если нет явного требования действовать иначе.

28 голосов
/ 01 февраля 2009

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

var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);
15 голосов
/ 19 ноября 2014

Я искал простое однострочное решение, чтобы получить следующий месяц с помощью математики, чтобы мне не пришлось искать функции даты в 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

Итак, вот оно.

5 голосов
/ 05 сентября 2012

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

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

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

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

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

2 голосов
/ 15 июля 2017

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

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

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

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)
1 голос
/ 09 марта 2018

Возможно, вы так и сделаете

var currentMonth = new Date().getMonth();

var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];

for(var i = currentMonth-1 ; i<= 4; i++){
console.log(monthNames[i])// make it as an array of objects here 

}
1 голос
/ 13 мая 2013

попробуйте это:

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);
0 голосов
/ 25 марта 2017

ах, красота троих:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...