2009-02-01 3 views
26

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

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

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

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

+5

вчера был 1 февраля ... – nickf

+9

смешно, вопрос был спросил 1 февраля в 00:03, время, которое он закончил со своим вопросом, было уже «датировано»: P –

ответ

38

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

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

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

EDIT:

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

+0

Конечно, стоит упомянуть, что все это зависит от того, на что установлена ​​дата вашего компьютера. Это редко бывает точной. –

+0

Хороший, @Josh :-) - у меня обычно не более нескольких минут. Я не могу ручаться за кого-то другого. Возможно, мне следует настроить ответ на чтение: «даст вам первый день месяца, следующего за месяцем вашего компьютера, который думает, что это так». – paxdiablo

+0

Это решение может не работать для zulu time. Мои приращения отключены по часовому поясу diff – Jess

25

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

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

Это, кажется, работает, если я использую current.getMonth() + 1 после использования вашего кода. Спасибо! – 2009-02-01 00:16:12

+0

Помните, что это устанавливает день месяца назад на 1 - это то, что вы хотели? – paxdiablo

+0

Все, что я хочу сделать, это добраться до следующего месяца с текущего месяца. Мне не нужны дни, мне нужен месяц, чтобы быть точным. – 2009-02-01 00:20:08

4

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

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

И вобще это

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

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

+0

Большая библиотека действительно полезна благодаря обмену! – talsibony

1

попробовать это:

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); 
9

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

Так что у вас есть.

+0

не знаю почему, но я использую это, чтобы добраться до следующего месяца (new Date(). GetMonth() + 1)% 12 + 23 –

+1

это математика :-) –

0

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

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

2

Если вы используете moment.js, они имеют функцию добавления. Вот ссылка - 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) 
0

Вы, вероятно, может сделать так

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 

}