Javascript 什么';使用Date对象&x27;s设置日期函数

Javascript 什么';使用Date对象&x27;s设置日期函数,javascript,Javascript,我有一个日期对象,我需要创建另一个日期对象,它在第一个日期对象之后1周。我已经有了一个实现,但是在10月、11月和12月,javascript似乎有一个bug。有解决办法吗?请注意,Chrome、FF和IE的行为是一致的 // ************ TEST#1 ************ var startDate = new Date(2011,08,05); // set to Sept 5, 2011 alert('START DATE'

我有一个日期对象,我需要创建另一个日期对象,它在第一个日期对象之后1周。我已经有了一个实现,但是在10月、11月和12月,javascript似乎有一个bug。有解决办法吗?请注意,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

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

编辑

OP指定错误正在测试中#2


这仍然不是一个bug。这里的问题是
setDate
只会更改月份的日期。在这里,您已经执行了
startDate.getDate()+7
where
startDate.getDate()==5
,因此它正确地将
endDate
的日期部分调整为每月的12日

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

编辑

OP指定错误正在测试中#2


这仍然不是一个bug。这里的问题是
setDate
只会更改月份的日期。在这里,您已经执行了
startDate.getDate()+7
where
startDate.getDate()==5
,因此它正确地将
endDate
的日期部分调整为每月的12日

除了JaredPar之外,new Date()将创建一个带有当前时间的日期,如果您只调用.setDate(),则只会更改“月日”

除了JaredPar之外,new Date()将创建一个带有当前时间的日期,如果您只调用.setDate(),则只会更改“月日”

我认为您的错误可能是将
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);

我认为您的错误可能是将
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);


我理解这一点,但我忘了添加TEST#3只是实现两个相隔一周的日期对象的不同实现。这个bug实际上在测试#2中。我理解这一点,但我忘了添加测试#3只是一个不同的实现,以实现我的目标,即拥有两个相隔一周的日期对象。这个bug实际上在测试2中。你的第一个假设不应该是“这是一个bug”,而应该是“我做错了什么?”。经过这么多年的封装和数百万的开发人员,你认为你会发现这样一个bug吗?你是对的。那么我做错了什么你的第一个假设不应该是“这是一个bug”,而应该是“我做错了什么?”。经过这么多年的封闭和数百万的开发人员,你认为你会发现这样一个bug吗?你是对的。那么我做错了什么嗨,乔纳森。我无法硬编码结束日期。我的目标是让endDate在startDate之后1周,不管startDate的值是多少。@Aleks我已将其编辑为我认为可以满足您的要求的值。让我知道它是否对你有效。有效!(但不需要月字段中的+1)。谢谢@Aleks是的,我想因为这个月是以零为基础的,所以需要一个+1,但是当我自己测试它时,我重新设置了日期字段,它采用以零为基础的数组,所以我再次编辑了我的awnser,并删除了这个月的+1。我在月底也进行了测试。如果你把日期改为30号,它将正确地滚动到下个月。嗨,乔纳森。我无法硬编码结束日期。我的目标是让endDate在startDate之后1周,不管startDate的值是多少。@Aleks我已将其编辑为我认为可以满足您的要求的值。让我知道它是否对你有效。有效!(但不需要月字段中的+1)。谢谢@Aleks是的,我想因为这个月是以零为基础的,所以需要一个+1,但是当我自己测试它时,我重新设置了日期字段,它采用以零为基础的数组,所以我再次编辑了我的awnser,并删除了这个月的+1。我在月底也进行了测试。如果你把日期改为30号,它将正确地滚动到下个月。我明白了。我的错是误解了setDate的行为。在这种情况下,我应该怎么做?您总是可以使用构造函数基于另一个日期实例化一个新日期:var x=new date(oldDate);x、 setDate(x.getDate()+7);但是,最好将时间添加为毫秒:var x=新日期(oldDate.valueOf()+7*86400*1000);7天乘以每天86400秒乘以1000得到毫秒,我明白了。我的错是误解了setDate的行为。在这种情况下,我应该怎么做?您总是可以使用构造函数基于另一个日期实例化一个新日期:var x=new date(oldDate);x、 setDate(x.getDate()+7);但是,最好将时间添加为毫秒:var x=新日期(oldDate.valueOf()+7*86400*1000);7天乘以每天86400秒乘以1000得到毫秒。