Javascript 没有闰日的两个日期之间的差异

Javascript 没有闰日的两个日期之间的差异,javascript,momentjs,Javascript,Momentjs,我有开始日期和结束日期,我必须得到这两个日期之间的差异,但条件是,如果是闰年,我必须排除2月29日。我可以通过momentJS获得两个日期之间的差异。但如果2月29日在该日期范围内,如何排除该日期 例如: //闰年 var startDate=力矩('2020-02-27') var endDate=时刻('2020-03-01') log('Diff in leap year',endDate.Diff(startDate,'days')//结果:3 var startDate1=力矩('2

我有开始日期和结束日期,我必须得到这两个日期之间的差异,但条件是,如果是闰年,我必须排除2月29日。我可以通过momentJS获得两个日期之间的差异。但如果2月29日在该日期范围内,如何排除该日期

例如:

//闰年
var startDate=力矩('2020-02-27')
var endDate=时刻('2020-03-01')
log('Diff in leap year',endDate.Diff(startDate,'days')//结果:3
var startDate1=力矩('2018-02-27')
var endDate1=力矩('2018-03-01')
log('non-leap year中的Diff',endDate1.Diff(startDate1',days')//结果:2

您可以使用
.isLeapYear()
检查
起始日期是否为闰年,然后相应地减去1

函数getDiff(开始日期、结束日期){ var isLeapYear=startDate.isLeapYear(); 返回endDate.diff(开始日期,'天')-(isLeapYear?1:0); } var startDate=力矩('2020-02-27') var endDate=时刻('2020-03-01') log('Diff in leap year',getDiff(startDate,endDate)); var startDate1=力矩('2018-02-27') var endDate1=力矩('2018-03-01') log('Diff in non leap year',getDiff(startDate1,endDate1))
您可以使用
.isLeapYear()
检查这是否是闰年,如果是,您可以从结果中再减去一天:

function diffDates(startDate, endDate) {
  var diff = endDate.diff(startDate, 'days');

  while(startDate < endDate) {
    if(startDate.isLeapYear() && 
      moment(`${startDate.year()}-02-29`).isBetween(startDate, endDate)) {
      diff--;
    }
    startDate.year(startDate.year() + 1);
  }
  return diff;
}

var startDate = moment('2020-02-27')
var endDate = moment('2020-03-01')

console.log('Leap year days diff: ' + diffDates(startDate, endDate)); // 2

startDate = moment('2018-02-27')
endDate = moment('2018-03-01')
console.log('Non leap year days diff: ' + diffDates(startDate, endDate)); // 2

startDate = moment('2019-02-27')
endDate = moment('2020-03-01')
console.log('Between leap year days diff: ' + diffDates(startDate, endDate)); // 367
函数diffDates(开始日期、结束日期){
var diff=endDate.diff(开始日期,'天');
while(开始日期<结束日期){
如果(startDate.isLeapYear()&&
时刻(${startDate.year()}-02-29`).isBetween(startDate,endDate)){
差异--;
}
起始日期年(起始日期年()+1);
}
返回差;
}
var startDate=力矩('2020-02-27')
var endDate=时刻('2020-03-01')
console.log('Leap year days diff:'+diffDates(startDate,endDate));//2.
起始日期=力矩('2018-02-27')
结束日期=时刻('2018-03-01')
console.log('Non-leap year days diff:'+diffDates(startDate,endDate));//2.
起始日期=力矩('2019-02-27')
结束日期=时刻('2020-03-01')
console.log('闰年天数之间的差异:'+diffDates(startDate,endDate));//367
我添加了一个子句,使用
.isBetween()
,知道您的日期是否在2月29日和闰年之间,并创建了一个
while
循环,每次闰日在间隔内时从
diff
中减去1

查看它的工作情况。

使用
.isLeapYear()
您可以迭代日期范围之间的所有年份,并获得预期结果

function dateDiff(startStr, endStr) {
  var startDate = moment(startStr);
  var endDate = moment(endStr);
  var diff = endDate.diff(startDate, 'days');
  for (var year = startDate.year(); year <= endDate.year(); year++) {
    var date = moment(year + '-02-29');
    if (date.isBetween(startDate,endDate) && date.isLeapYear()) {
        diff -= 1;
    }
  }
  return diff;
}

console.log(dateDiff('2020-02-27', '2020-03-01'));
console.log(dateDiff('2018-02-27', '2018-03-01'));
函数dateDiff(startStr,endStr){ var startDate=力矩(startStr); var endDate=力矩(endStr); var diff=endDate.diff(开始日期,'天');
对于(var year=startDate.year();year您可以尝试以下方法:

  • 检查所选年份是否为闰年
  • 如果是,检查日期范围是否涵盖2月29日
  • 如果是,则减去1,否则为0
函数getDiff(开始日期、结束日期){ var dayToExclude=时刻('29/02/'+起始日期年(),'DD/MM/YYYY'); var excludeDays=startDate.isLeapYear()&&startDate.isBefore(dayToExclude)和&endDate.isAfter(dayToExclude)?1:0; 返回endDate.diff(开始日期,'天')-不包括天; } var startDate=力矩('2020-02-27') var endDate=时刻('2020-03-01') log('Diff in leap year',getDiff(startDate,endDate)); var startDate1=力矩('2018-02-27') var endDate1=力矩('2018-03-01') log('Diff in non leap year',getDiff(startDate1,endDate1));

您所能做的就是通过
startDate.isLeapYear()检查是否为闰年
如果是这样的话,你可以从结果中再减去一天。如果闰日在开始日期和结束日期之间,你只想减去。那么跨越几年的范围是什么?2019-12-31到2020-03-01…或者包括一个或多个闰年的大范围。但是对于简单的情况,这看起来不错。我假设日期在同一年内。问题状态不同误差可能超过一年,所以对这个问题来说可能不是一个安全的假设。这正如我所预期的那样有效,有什么最佳的解决方案吗?