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.



