JavaScript添加不增加月份的天数

JavaScript添加不增加月份的天数,javascript,getdate,Javascript,Getdate,我知道这个问题已经出现过很多次了,我使用了推荐的解决方案来创建我的函数,但我用它来滚动日历,直到下一个/上一个4周 似乎发生的是,它第一次计算d+28时是正确的,但当输出的结果用于函数时,它不起作用 控制台日志中的示例: 第一次按“下一步”: start Before = Tue Jul 28 2015 21:53:20 GMT+0100 (GMT Daylight Time) start After = Tue Aug 25 2015 21:53:22 GMT+0100 (GMT Daylig

我知道这个问题已经出现过很多次了,我使用了推荐的解决方案来创建我的函数,但我用它来滚动日历,直到下一个/上一个4周

似乎发生的是,它第一次计算d+28时是正确的,但当输出的结果用于函数时,它不起作用

控制台日志中的示例:

第一次按“下一步”:

start Before = Tue Jul 28 2015 21:53:20 GMT+0100 (GMT Daylight Time)
start After = Tue Aug 25 2015 21:53:22 GMT+0100 (GMT Daylight Time)
第二次按“下一步”:

start Before = Tue Aug 25 2015 21:53:22 GMT+0100 (GMT Daylight Time)
start After = Sat Aug 22 2015 21:53:28 GMT+0100 (GMT Daylight Time)
就这样继续下去

HTML:


你好,普朗克!

{{start}}
JS:

var testApp=angular.module('testApp',[]);
testApp.controller('testController',函数($scope){
$scope.start=新日期();
$scope.nextWeeks=函数(d){
log('Next:');
log('start Before='+d);
$scope.start=addDays(d,28);
log('start After='+$scope.start);
console.log('\n');
}
$scope.prevWeeks=函数(d){
console.log('Previous');
log('start Before='+d);
$scope.start=addDays(d,-28);
log('start After='+d);
console.log('\n');
}
});
功能添加天数(d,数量){
var dd=d.getDate();
变量mm=d.getMonth()+1;
变量yyyy=d.getFullYear();
如果(dd<10)dd='0'+dd;
如果(mm<10)mm='0'+mm;
var moreDate=新日期(yyyy,mm-1,dd);
var someDate=新日期();
someDate.setDate(moreDate.getDate()+数量);
返回某个日期;
}
在Plnkr上


有什么想法吗?我有什么地方出错了吗?

您的功能可以大大简化,因为
日期类型会在日期超出范围时自动调整月份

function addDays(d, qty) {
    var dd = d.getDate();
    var mm = d.getMonth();
    var yyyy = d.getFullYear();
    return new Date(yyyy, mm, dd + qty);
}
另一种方法是:

function addDays(d, qty) {
    var newDate = new Date(d.getTime()); // Copy date
    newDate.setDate(d.getDate() + qty);
    return newDate;
}

既然已经提供了解决方法,让我告诉你为什么你的方法不起作用。首先创建将年和月调整为预期值的
moreDate
,然后创建
someDate
,将其初始化为当前日期以及当前月份和当前年份。将
qty
添加到日期,并将其设置为
someDate
。然后计算是相对于今天,而不是相对于作为参数提供的日期。比如说,

var d = new Date(); //July 28 2015
d = addDays(d,28); //Aug 25 2015,works because we added 28 days to today
d = addDays(d,28); //Aug 22 2015!! Looks wrong, but is it?
最后一个电话显然是错的,但事实并非如此。逐步浏览您的代码:

  /*more code*/
  var moreDate = new Date(yyyy, mm - 1, dd); //Aug 25 2015

  var someDate = new Date(); //Catch!! July 28 2015
  someDate.setDate(moreDate.getDate() + qty); //Catch!!
  //the call above added 28+25 days to today which is Aug 22 2015
  return someDate;

为此,我建议您使用moment.js库!我不明白你为什么要在
addDays
中的月份中加减1?当您使用
setDate()
时,如果日期超过当月天数,它将自动调整月份。谢谢,我的意思是初始化某个日期以供使用。非常好,谢谢。我明白我做错了什么,所以感谢大家的理解和帮助。
var d = new Date(); //July 28 2015
d = addDays(d,28); //Aug 25 2015,works because we added 28 days to today
d = addDays(d,28); //Aug 22 2015!! Looks wrong, but is it?
  /*more code*/
  var moreDate = new Date(yyyy, mm - 1, dd); //Aug 25 2015

  var someDate = new Date(); //Catch!! July 28 2015
  someDate.setDate(moreDate.getDate() + qty); //Catch!!
  //the call above added 28+25 days to today which is Aug 22 2015
  return someDate;