Javascripts dateObject: переход с 31 мая на следующий месяц получает 1 июля

Мне пришлось создать DatePicker без какой-либо библиотеки (например, jQuery) для клиента. Мне удалось на моей локальной машине. Однако мой клиент использует его сейчас, и он показывает странное поведение, если он включен в его веб-приложение.

Если я выберу 31 мая и перейду к следующему месяцу, я окажусь 1 июля. Фактически DateObject имеет 31 мая, прежде чем я нажму кнопку, чтобы запустить функцию «jumpToNextMonth». Я предполагаю, что dateObject переходит на 31 июня, которого не существует, а затем переходит на один вперед к 1 июля. Это происходит и в августе, и во всех других 30-дневных месяцах, за которыми следуют 31-дневные месяцы.

Строка, которая запускается при нажатии,

this.currentDate = new Date(this.currentDate.getFullYear(),
                           this.currentDate.getMonth() + 1,
                           this.currentDate.getDate());

Я не вижу такого поведения на своем локальном компьютере и не вижу, чтобы он работал на сервере Apache. Я не могу представить, что портит объект даты в веб-приложении моих клиентов, и, к сожалению, у меня нет доступа к их файлам.

Я был бы очень признателен, если бы вы помогли мне ответить на эти два вопроса:

  1. почему этого не происходит на моей локальной машине
  2. как мне исправить это, не устанавливая день на «1», например. this.currentDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 1);

Я нашел похожие вопросы без ответа здесь ">Flex Mobile 4.6: DateSpinner dateAndTime перескакивает с 31 января на 1 марта


person ProblemsOfSumit    schedule 13.07.2012    source источник
comment
Вы сами ответили на свой вопрос. 31 июня в объекте фактически 1 июля.   -  person Paul Fleming    schedule 13.07.2012


Ответы (1)


Вы сами ответили на свой вопрос. 31 июня в объекте фактически 1 июля.

Это решает вашу проблему?

function daysInMonth(month, year)
{
    return 32 - new Date(year, month, 32).getDate();
}

var y = this.currentDate.getFullYear();
var m = this.currentDate.getMonth() + 1;
var d = Math.min(this.currentDate.getDate(), daysInMonth(m, y);
this.currentDate = new Date(y, m, d);
person Paul Fleming    schedule 13.07.2012
comment
Хорошо, я действительно нашел, почему этого не происходит на моей локальной машине. Как это обычно фиксируется в JavaScript DatePickers? Прыгать на 1 число каждого месяца? - person ProblemsOfSumit; 13.07.2012
comment
Я отредактировал свой пост. Приведенный код решает вашу проблему? - person Paul Fleming; 13.07.2012
comment
это так, спасибо. Хотя я передумал и буду просто переходить на 1-е число каждого месяца :-) - person ProblemsOfSumit; 13.07.2012