У меня есть Дата начала и Дата окончания, и я должен получить разницу между этими двумя датами, но при условии, я должен исключить 29 февраля, если это високосный год. Я могу получить разницу между двумя датами с помощью momentJS. Но как исключить 29 февраля, если оно находится в этом диапазоне дат.

Например:

//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-е февраля из расчета. Разница может быть больше года.

Есть ли оптимальное решение для этого?

2
Laxmikant Dange 5 Мар 2018 в 10:00

4 ответа

Лучший ответ

Используя .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'));
1
Laxmikant Dange 5 Мар 2018 в 08:01

Вы можете попробовать что-то вроде этого:

  • Проверьте, является ли выбранный год високосным.
  • Если да, проверьте, охватывает ли диапазон дат 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>
0
Rajesh 5 Мар 2018 в 07:44

Вы можете проверить, является ли это високосным годом, используя .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

Я добавил предложение, чтобы узнать, находятся ли ваши даты между 29 февраля, когда високосный год с использованием .isBetween(), и создал цикл while, чтобы вычитать 1 из diff каждый раз, когда високосный день находится в пределах интервала.

Посмотрите, как это работает здесь.

2
guijob 5 Мар 2018 в 07:54

Вы можете проверить, является ли 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>
1
void 5 Мар 2018 в 07:14