Sum of Useful Days

0

Is there any way to add business days to a date that does not use repeat loops (such as while and for)?

I currently use this code

var novaData = new Date(dataBase.valueOf());
var diasUteisRemanescente;
var isFimDeSemana;
var direcao;


// Remove decimais 
if (diasSoma !== parseInt(diasSoma, 10)) { throw new TypeError('AdicionaDiaUtil utiliza apenas dias uteis.'); }

// Se zero dias, não realiza mudança 
if (diasSoma === 0) { return dataBase; }

//Decide soma ou subtração 
direcao = diasSoma > 0 ? 1 : -1;

//decide numero de iterações
diasUteisRemanescente = Math.abs(diasSoma);

//Intera até chegar zerar os dias 
while (diasUteisRemanescente) {
    // adiciona/subtrai um dia 
    novaData.setDate(novaData.getDate() + direcao);
    //Verifica se o dia é util
    if (isSabadoUtil) {
        isFimDeSemana = novaData.getDay() in { 0: 'Sunday' };
    }
    else {
        isFimDeSemana = novaData.getDay() in { 0: 'Sunday', 6: 'Saturday' };
    }
    //Se for util remove um dia 
    if (!isFimDeSemana) { diasUteisRemanescente--; }
}
return novaData;
    
asked by anonymous 04.02.2016 / 11:04

2 answers

1

Yes, you can do what you want by replacing the while with a recursive call to a given function:

var novaData = new Date(dataBase.valueOf());
var diasUteisRemanescente;
var direcao;

// Remove decimais 
if (diasSoma !== parseInt(diasSoma, 10)) {
    throw new TypeError('AdicionaDiaUtil utiliza apenas dias uteis.');
}

// Se zero dias, não realiza mudança 
if (diasSoma === 0) { return dataBase; }

//Decide soma ou subtração 
direcao = diasSoma > 0 ? 1 : -1;

//decide numero de iterações
diasUteisRemanescente = Math.abs(diasSoma);

// Chamada recursiva
novaData = >>>> calculaNovaData(novaData, diasUteisRemanescente, direcao); <<<<

return novaData;

And the new function would be something like this:

function calculaNovaData(data, dias, direcao) {
    if (dias == 0) {
        return data;
    }

    var isFimDeSemana;

    // adiciona/subtrai um dia 
    data.setDate(data.getDate() + direcao);
    //Verifica se o dia é util
    if (isSabadoUtil) {
        isFimDeSemana = data.getDay() in { 0: 'Sunday' };
    }
    else {
        isFimDeSemana = data.getDay() in { 0: 'Sunday', 6: 'Saturday' };
    }
    //Se for util remove um dia 
    if (!isFimDeSemana) { dias--; }

    return calculaNovaData(data, dias, direcao);
}
    
04.02.2016 / 11:23
2

If you do not want to use recursion, you can use Moments.js Using the following syntax:

moment().businessAdd(7);
moment().businessDiff(moment().subtract(7, 'd'));
    
04.02.2016 / 11:43