移动到下个月时,将日期添加到javascript日期对象不起作用

时间:2010-10-11 21:18:45

标签: javascript date

我在使用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;                                               
}     

当传递给此函数的日期类似于“10月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"]

但是,当通过“10月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"]

显然,在一个日期对象中添加一天会在移动到另一个月时出现问题,我只是不确定如何绕过它。有什么想法吗?

编辑:

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

};

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 个答案:

答案 0 :(得分:2)

在循环内部,您使用提供的date作为每个 setDate()的参考点:

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

date是十月(31)的最后一天,且i为1时,这会将_d个月的日期设置为第32天 - 即11月1日。在下一次迭代中,您将_d的某一天设置为(31 + 2),但请记住_d现在位于 11月 - 因此日期将向前移至12月3日。在随后的迭代中,您的步长每月增加一天,因此您的结果。你可以在_d打电话给吸气者吗?在这种情况下,不是将日期设置为32,33,34等天,您将设置为32,然后设置为2,3,依此类推。

答案 1 :(得分:0)

旧主题,但如果有人到达此页面,这个小功能可能会有用。

要包含月份管理,您可以使用原始日期的“getTime()”函数创建新日期,并添加要添加的天数的相应值。

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

此致