Sum of Useful Days

Asked

Viewed 4,871 times

0

Is there any way to add useful days to a date that doesn’t use repeat loops (like 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;
  • With or without "gambiarra"?

  • There may or may not be

2 answers

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'));
  • fba_pereira, welcome to Stackoverflow! We appreciate you wanting to help! However, your answer boils down to a link that is valid at the moment but nothing guarantees that it will continue to be so in the future. Stackoverflow should be viewed as a repository of knowledge and not just a website question and answer. In answering we must think not only of those who asked, but also of those who in the future will be able to benefit from our answer.

1


Yes, it is possible to do the desired by replacing the cycle while by 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:

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);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.