добавление дня в объект даты в JavaScript не работает при переходе на следующий месяц - PullRequest
3 голосов
/ 12 октября 2010

У меня проблема при работе с объектами даты в JavaScript, особенно при попытке добавить день к объекту даты. Функция, которую я пишу, берет начальную дату и создает список следующих семи дней, используемый в качестве заголовков приложения календаря «просмотр недели». Когда даты недели, которые она определяет, находятся в одном месяце, моя функция работает, как и ожидалось. При переходе на следующий месяц все становится не так.

Моя функция создания списка дат (ПРИМЕЧАНИЕ. Метод .toHdr () - это пользовательский метод дат, который я создал, как и .clone ()):

getWeekDates : function(date){                                  
    /*                                                          
     * Given a date object, returns a list of dates strings that
     * become the header of the week view                       
     */                                                         
    var _d = date.clone(), dates = [];                          
    for(var i=1; i<=7; i++){                                    
        dates.push(_d.toHdr());                                 
        _d.setDate(date.getDate() + i);                         
    }                                                                             
    return dates;                                               
}     

Когда дата, переданная этой функции, выглядит как «понедельник 11 октября» (как объект даты), функция, приведенная выше, возвращает:

["Monday - Oct. 11, 2010", "Tuesday - Oct. 12, 2010", "Wednesday - Oct. 13, 2010", "Thursday - Oct. 14, 2010", "Friday - Oct. 15, 2010", "Saturday - Oct. 16, 2010", "Sunday - Oct. 17, 2010"]

Тем не менее, когда передается такая дата, как «Воскресенье, 31 октября», возвращаемый список выглядит следующим образом:

["Sunday - Oct. 31, 2010", "Monday - Nov. 1, 2010", "Friday - Dec. 3, 2010", "Monday - Jan. 3, 2011", "Friday - Feb. 4, 2011", "Tuesday - Mar. 8, 2011", "Wednesday - Apr. 6, 2011"]

Очевидно, что добавление одного дня к объекту даты становится проблематичным при переходе на другой месяц, я просто не совсем уверен, как его обойти. Есть идеи?

EDIT:

Date.prototype.toHdr = function(){
    /*
     * Convenience method for creating a formatted string that will be used in
     * all headers with a specific date.
     */
    var dayMapping = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
    var monthMapping = ['Jan.','Feb.','Mar.','Apr.','May','June','July','Aug.','Sept.','Oct.','Nov.','Dec.'];
    return dayMapping[this.getDay()] + ' - ' + monthMapping[this.getMonth()] + ' ' + this.getDate() + ', ' + this.getFullYear();
* * 1016};
Date.prototype.clone = function(){
    /*
     * Clone a date object, useful for creating a copy of a date, so the
     * original isn't modified.
     */
    return new Date(this.getTime());
}

Ответы [ 2 ]

3 голосов
/ 12 октября 2010

Внутри цикла вы используете поставляемую date в качестве контрольной точки для каждые setDate ():

_d.setDate(date.getDate() + i);

Когда date - последний день октября (31), а i - 1, это устанавливает _d день месяца на 32-е, т. Е. 1 ноября. На следующей итерации вы устанавливаете день месяца _d на (31 + 2), но помните, что _d теперь в ноябре - поэтому дата перемещается вперед на 3 декабря. В последующих итерациях размер вашего шага увеличивается на дополнительный день каждый месяц, отсюда и ваш результат. Не могли бы вы вместо этого вызвать геттера на _d? В этом случае вместо установки дня месяца равным 32,33,34 и т. Д. Вы должны установить значение 32, затем 2, 3 и т. Д.

0 голосов
/ 24 февраля 2012

Старая тема, но в случае, если кто-то достигнет этой страницы, эта маленькая функция может быть полезна.

Чтобы включить управление месяцами, вы можете создать новую дату, используя функцию «getTime ()» исходной даты и добавив соответствующее значение вашего количества дней для добавления.

function addDays(date,addDays) {
    return new Date(date.getTime() + (addDays*24*60*60*1000));
}

Привет

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