Tengo Fecha de inicio y Fecha de finalización y tengo que obtener la diferencia entre estas dos fechas, pero la condición es que tengo que excluir el 29 de febrero si es año bisiesto. Puedo obtener la diferencia entre dos fechas usando momentJS. Pero cómo excluir el 29 de febrero si está en ese rango de fechas.

Por ej .:

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

Espero un resultado uniforme para los años bisiestos y no bisiestos, o simplemente quiero excluir el 29 de febrero del cálculo. La diferencia puede ser más de un año.

¿Hay alguna solución óptima para hacerlo?

2
Laxmikant Dange 5 mar. 2018 a las 10:00

4 respuestas

La mejor respuesta

Usando .isLeapYear() puede iterar durante todos los años entre el rango de fechas y obtener el resultado esperado

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 mar. 2018 a las 08:01

Puedes probar algo como esto:

  • Verifique si el año seleccionado es bisiesto.
  • En caso afirmativo, verifique si el rango de fechas cubre 29th Feb
  • En caso afirmativo, reste 1 más 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 mar. 2018 a las 07:44

Puede verificar si es un año bisiesto con .isLeapYear() y, de ser así, restar un día más de su resultado:

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

Agregué una cláusula para saber si sus fechas están entre el 29 de febrero, cuando es un año bisiesto con .isBetween(), y creé un bucle while para restar 1 de diff cada vez que un día bisiesto está dentro del intervalo.

Véalo funcionando aquí.

2
guijob 5 mar. 2018 a las 07:54

Puede verificar si startDate es un año bisiesto o no con .isLeapYear() y luego restar 1 en consecuencia.

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 mar. 2018 a las 07:14