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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有闰日的两个日期之间的差异相关的知识,希望对你有一定的参考价值。

我有开始日期和结束日期,我必须在这两个日期之间得到区别,但条件是,如果是闰年,我必须排除2月29日。我可以使用momentJS在两个日期之间获得差异。但如果它在那个日期范围内,如何排除第29个feb。

对于Ex:

//For Leap Year
var startDate = moment('2020-02-27')
var endDate = moment('2020-03-01')
console.log('Diff in leap year', endDate.diff(startDate, 'days')); //Result: 3



var startDate1 = moment('2018-02-27')
var endDate1 = moment('2018-03-01')
console.log('Diff in non leap year', endDate1.diff(startDate1, 'days')); //Result: 2 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.21.0/moment.min.js"></script>

我期待跳跃和非闰年的统一结果,或者只是想从计算中排除第29个feb。差异可能超过一年。

有没有最佳解决方案呢?

答案

使用.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'));
另一答案

您可以使用.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

我添加了一个条款,知道你的日期是否在使用.isBetween()的闰年之间的29日之间,并且每当闰日在间隔内时创建一个while循环从diff中减去1。

看到它工作here

另一答案

您可以使用startDate检查.isLeapYear()是否是闰年,然后相应地减去1。

function getDiff(startDate, endDate)
  var isLeapYear = startDate.isLeapYear();
  return endDate.diff(startDate, 'days') - (isLeapYear?1:0);



var startDate = moment('2020-02-27')
var endDate = moment('2020-03-01')
console.log('Diff in leap year', getDiff(startDate, endDate)); 

var startDate1 = moment('2018-02-27')
var endDate1 = moment('2018-03-01')
console.log('Diff in non leap year',getDiff(startDate1, endDate1));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.21.0/moment.min.js"></script>
另一答案

你可以尝试这样的事情:

  • 检查所选年份是否为闰年。
  • 如果是,请检查日期范围是否涵盖29th Feb
  • 如果是,则减去1,否则为0

function getDiff(startDate, endDate)
  var dayToExclude = moment('29/02/' + startDate.year(), 'DD/MM/YYYY');
  var excludeDays = startDate.isLeapYear() && startDate.isBefore(dayToExclude) && endDate.isAfter(dayToExclude) ? 1 : 0;
  return endDate.diff(startDate, 'days') - excludeDays;



var startDate = moment('2020-02-27')
var endDate = moment('2020-03-01')
console.log('Diff in leap year', getDiff(startDate, endDate)); 

var startDate1 = moment('2018-02-27')
var endDate1 = moment('2018-03-01')
console.log('Diff in non leap year',getDiff(startDate1, endDate1));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.21.0/moment.min.js"></script>

以上是关于没有闰日的两个日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中计算两个日期之间的年龄或差异

如何计算两个日期之间的差异

PySpark SQL 中的日期之间的差异

如何找到两个日期之间的差异c ++

两个日期之间的oracle差异

如何计算Python Pandas中两列之间的日期差异[重复]