Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between two dates without leap day

I have Start Date and End Date and I have to get difference between these two dates, but the condition is, I have to exclude 29th Feb if it is leap year. I am able to get difference between two dates using momentJS. But how to exclude 29th feb if it is in that date range.

For 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>

I am expecting uniform result for leap and non leap year, or simply want to exclude 29th feb from calculation. Difference can be more than a year.

Is there any optimal solution to do it?

like image 966
Laxmikant Dange Avatar asked Nov 14 '25 17:11

Laxmikant Dange


2 Answers

You can check if it is a leap year using .isLeapYear() and if so, you subtract one more day from your result:

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

I've added a clause to know if your dates is between feb 29 when is a leap year using .isBetween(), and created a while loop to subtract 1 from diff every time a leap day is within interval.

See it working here.

like image 144
guijob Avatar answered Nov 17 '25 09:11

guijob


Using .isLeapYear() you can iterate over all the years between date range and get the expected result

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'));
like image 32
Yogesh Avatar answered Nov 17 '25 09:11

Yogesh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!