我的实现有什么问题,使用Date对象的setDate函数

时间:2011-09-09 13:47:51

标签: javascript

我有一个日期对象,我需要在第一个日期对象后1周创建另一个日期对象。我已经有了一个实现,但是当它到达十月,十一月和十二月时,似乎存在javascript的错误。这有解决方法吗?请注意,Chrome,FF和IE中的行为是一致的。

        // ************ TEST#1 ************
        var startDate = new Date(2011,08,05); // set to Sept 5, 2011
        alert('START DATE' + startDate);

        var endDate = new Date();
        endDate.setDate(startDate.getDate() + 7);

        alert('END DATE' + endDate); // endDate is Sept 12 which is correct
        // check that startDate's value is unchanged
        alert('START DATE' + startDate); 


        // ************ TEST#2 ************
        var startDate = new Date(2011,10,05); // set to Nov 5, 2011
        alert('START DATE' + startDate);

        var endDate = new Date();
        endDate.setDate(startDate.getDate() + 7);

        alert('END DATE' + endDate); // endDate is Sept 12, 2011 which is wrong
        alert('START DATE' + startDate);



        // ************ TEST#3 ************
        // changed implementation but this won't work
        var startDate = new Date(2011,10,05);
        alert('START DATE' + startDate);

        var endDate = startDate;
        endDate.setDate(startDate.getDate() + 7);

        alert('END DATE' + endDate); // endDate is correct but...
        alert('START DATE' + startDate); // startDate's value has changed as well

3 个答案:

答案 0 :(得分:3)

我认为您的错误可能是您今天正在设置endate

    // ************ TEST#2 ************
    var startDate = new Date(2011,10,05); // set to Nov 5, 2011
    alert('START DATE' + startDate);

    // edit
    var endDate = new Date(startDate.getFullYear(),startDate.getMonth(),startDate.getDate() + 7);
    // old var endDate = new Date();
    // endDate.setDate(startDate.getDate() + 7);

    alert('END DATE' + endDate); // endDate is Sept 12, 2011 which is wrong
    alert('START DATE' + startDate);

答案 1 :(得分:2)

这不是错误。在这种情况下,Date是一个对象,startDateendDate都引用相同的Date实例。因此,当您更改基础对象时,它通过两个引用

可见

编辑

OP指定错误在测试#2

这仍然不是一个错误。这里的问题是setDate只会改变一个月中的某一天。在此,您已执行startDate.getDate() + 7 startDate.getDate() === 5,因此正确地将endDate的日期部分调整为该月的第12个月。

答案 2 :(得分:1)

除了JaredPar之外,新的Date()将使用当前时间创建日期,如果您只调用.setDate(),则只会更改“day of month”。