Installment with date, hopping month of February

1

Good afternoon. I'm studying a little JS and found something interesting that I plan to use. But I noticed that the JS below that generates installments with the expiration dates, skips the month of February.

I can not identify where the error might be, so I can change and finally do it correctly.

Could you help me?

Code:

function correcaoDia(dia) {
    if (isNaN(dia)) return false;
    
    return dia < 10 ? "0" + dia : dia ;
}

function correcaoMes(mes) {
    if (isNaN(mes)) return false;
    
    return mes < 10 ? "0" + mes : mes ;
}

function calcularParcelas(parcelas, stringData) {
    var ano = stringData.substring(6,10);
    var mes = stringData.substring(3,5);
    var dia = stringData.substring(0,2);
    var dataInicial = new Date(ano,mes,dia);
    var dataParcela = new Date();
    var resultado = "";
    var novoMes = 0;
    var novoAno = 0;
    
    resultado += "<ul>";
    for ( var p = 0 ; p < parcelas ; p++ ) {
        novoMes = ( dataInicial.getMonth() + p ) % 12;
        novoMes = novoMes == 0 ? 12 : novoMes;
        novoAno = dataInicial.getFullYear() + ( ( ( dataInicial.getMonth() + p ) - novoMes ) / 12 );
        
        dataParcela.setMonth(novoMes);
        dataParcela.setYear(novoAno);
        
        resultado += "<li>";
        resultado += correcaoDia(dataParcela.getDate());
        resultado += "/";
        resultado += correcaoMes(dataParcela.getMonth() + 1);
        resultado += "/";
        resultado += dataParcela.getFullYear();
        resultado += "</li>";
    }
    resultado += "</ul>";
    
    return resultado;
}

var parcelas = 8;
document.write(calcularParcelas( parcelas, "29/09/2016"));
    
asked by anonymous 29.09.2016 / 20:47

1 answer

1

I included a check for leap years and February 29th. If you put the 2/29 into a non-leap year, the date goes to 3/1.

function correcaoDia(dia) {
    if (isNaN(dia)) return false;
    
    return dia < 10 ? "0" + dia : dia ;
}

function correcaoMes(mes) {
    if (isNaN(mes)) return false;
    
    return mes < 10 ? "0" + mes : mes ;
}

function calcularParcelas(parcelas, stringData) {
    var ano = stringData.substring(6,10);
    var mes = stringData.substring(3,5);
    var dia = stringData.substring(0,2);

  if(dia =='29' && leapYear(ano )) dia = '28';

    var dataInicial = new Date(ano,mes,dia);
console.log(dataInicial );
    var dataParcela = new Date();
    var resultado = "";
    var novoMes = 0;
    var novoAno = 0;
    
    resultado += "<ul>";
    for ( var p = 0 ; p < parcelas ; p++ ) {
        novoMes = ( dataInicial.getMonth() + p ) % 12;
        novoMes = novoMes == 0 ? 12 : novoMes;
        novoAno = dataInicial.getFullYear() + ( ( ( dataInicial.getMonth() + p ) - novoMes ) / 12 );

 dataParcela.setDate(dia);
        dataParcela.setMonth(novoMes);
        dataParcela.setYear(novoAno);
        
        resultado += "<li>";
        resultado += correcaoDia(dataParcela.getDate());
        resultado += "/";
        resultado += correcaoMes(dataParcela.getMonth() + 1);
        resultado += "/";
        resultado += dataParcela.getFullYear();
        resultado += "</li>";
    }
    resultado += "</ul>";
    
    return resultado;
}


  //http://stackoverflow.com/a/16353241/2467235
  function leapYear(year){
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
  }



var parcelas = 8;
document.write(calcularParcelas( parcelas, "29/09/2016"));
    
29.09.2016 / 21:45