Subtrair dias de um input date com javascript – javascript html5 date

Pergunta:


Preciso pegar um os dados de um campo type number e somar a uma data de um input date. Eu já consegui, porém preciso agora pegar o resultado dessa data e subtrair 14 dias, mas não to conseguindo. Sou iniciante e preciso fazer isso, me ajudem por favor. O que eu preciso fazer para subtrair 14 ao resultado do input date datafin?

HTML:

<input type="date" id="ini" />
<input onchange="calculater();" name="dias" type="number" id="dias" min="20" max="40" size="70" />
<input name="datafin" type="date" id="datafin" size="70" />

Javascript:

function calculater() {
    var inicial = document.getElementById("ini").value;
    var dias = parseInt(document.getElementById("dias").value);
    var partes = datainicial.split("-");
    var ano = partes[0];
    var mes = partes[1] - 1;
    var dia = partes[2];

    inicial = new Date(ano, mes, dia);
    final = new Date(inicial);
    final.setDate(final.getDate() + dias);

    var dd = ("0" + final.getDate()).slice(-2);
    var mm = ("0" + (final.getMonth() + 1)).slice(-2);
    var y = final.getFullYear();

    var dataformatada = y + '-' + mm + '-' + dd;
    document.getElementById('datafin').value = dataformatada;
}

Autor da pergunta Letícia Silva

Resposta Lucas Costa:

var data = new Date();

document.write('Hoje é: ' + data.toLocaleString());

data.setDate(data.getDate() - 14);

document.write('<br>14 dias atrás: ' + data.toLocaleString());

No seu caso:

function calculater() {
  var inicial = document.getElementById("ini").value;
  var dias = parseInt(document.getElementById("dias").value);
  var partes = inicial.split("-");
  var ano = partes[0];
  var mes = partes[1] - 1;
  var dia = partes[2];

  inicial = new Date(ano, mes, dia);
  final = new Date(inicial);
  final.setDate(final.getDate() + dias);
  final.setDate(final.getDate() - 14); // menos 14 dias do resultado

  var dd = ("0" + final.getDate()).slice(-2);
  var mm = ("0" + (final.getMonth() + 1)).slice(-2);
  var y = final.getFullYear();

  var dataformatada = y + '-' + mm + '-' + dd;
  document.getElementById('datafin').value = dataformatada;
}
<input type="date" id="ini" />
<input onchange="calculater();" name="dias" type="number" id="dias" min="20" max="40" size="70" />
<input name="datafin" type="date" id="datafin" size="70" />

tl;dr:
O mais correto é algo do tipo:

inicial = new Date(ano, mes, dia);
milissegundos_por_dia = 1000 * 60 * 60 * 24;
data_final = new Date(inicial.getTime() + dias * milissegundos_por_dia);

explicando:

O objeto Date do Javascript possui alguns métodos convenientes, para acessar cada tipo de valor associado à data que ele contém.

O método .getDate em particular recupera o dia do mês, como um número inteiro. O problema ao querer subtrair datas usando o getDate() é quando se chega nas “fronteiras” de um mês: tudo bem se for dia 15 e você quer a data de 2 dias atrás – getDate() retorna 15, você tira 2, tem 13, faz um setDate, e tem a data correta de 2 dias atrás.

O problema é se você está no dia 7 e quer a data de 15 dias atrás. Ou simplesmente quer a data de 30 dias atrás. Usando o getDate, você teria que fazer uma estrutura de if e else para quando o dia do mês desejado fosse negativo, subtrair um do mês, e aí ajustar o dia apropriadamente. E mais um if para o caso do mês que voltou ser de Janeiro pra Dezembro, e nesse caso, subtrair o ano.
Isso para não mencionar os inúmeros corner-cases, como os bissextos, início e fim de horário de verão, etc… pode parecer trivial a principio, mas sempre é legal ter em mente que a própria Microsoft, nas primeiras versões do Excel errou o cálculo de datas para o ano de 1900 (tratando-o como bissexto, sendo que não era – e até hoje o formato de datas codificado em arquivos .XLS sofre por conta desse erro).

Felizmente, o objeto Date também tem os métodos getTime e setTime, que em vez de dizer uma data como mês, dia, ano, horas, minutos e segundos em campos separados, devolve (e aceita) um único número inteiro: O número de milissegundos passados desde a meia noite de 1/1/1970.

Essa representação deriva do chamado “unixtime”, usado em servidores e programas no mundo inteiro – que representa o número de segundos passado desde a mesma data. (veja que em Javascript, temos os milissegundos, não os segundos).

Então, dada uma data, tudo o que precisamos fazer para calcular a subtração (ou adição) de um certo número de dias é usar o .getTime, manipular esse número, e usar o .setTime ou criar um novo objeto Date para ter como obter os valores “utilizáveis por humanos”, de mês, dia e ano, da data desejada.

Ou seja:

...
ano = ...;
mes = ...;
dia = ...;
...
dias = ...; 
...
inicial = new Date(ano, mes, dia);
milissegundos_por_dia = 1000 * 60 * 60 * 24;
data_final = new Date(inicial.getTime() + dias * milissegundos_por_dia);

E pronto – você tem a data final sem nenhum problema de cálculo de mês, virada do ano, leap second – você reusa todas as milhares de linhas de código que estão no navegador e no sistema operacional para calcular a data, sem precisar reinventar a roda.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *