Como adicionar / subtrair datas com JavaScript?

Quero permitir que os usuários adicionem e subtraiam facilmente datas usando JavaScript para procurar as inputs por data.

As datas estão no formato: “mm / dd / yyyy”. Eu quero que eles sejam capazes de clicar em um botão “Next”, e se a data for: “06/01/2012”, em seguida, ao clicar em próximo, ele deve se tornar: “06/02/2012”. Se eles clicarem no botão ‘anterior’, ele deverá se tornar “31/05/2012”.

Ele precisa acompanhar os anos bissextos, o número de dias no mês, etc.

Alguma ideia?

PS usando AJAX para obter a data do servidor não é uma opção, é um pouco lento e não a experiência para o usuário que o cliente deseja.

Código:

 var date = new Date('2011','01','02'); alert('the original date is '+date); var newdate = new Date(date); newdate.setDate(newdate.getDate() - 7); // minus the date var nd = new Date(newdate); alert('the new date is '+nd);​ 

Demonstração JSFiddle

Usando o Datepicker:

 $("#in").datepicker({ minDate: 0, onSelect: function(dateText, inst) { var actualDate = new Date(dateText); var newDate = new Date(actualDate.getFullYear(), actualDate.getMonth(), actualDate.getDate()+1); $('#out').datepicker('option', 'minDate', newDate ); } }); $("#out").datepicker();​ 

Demonstração JSFiddle

Coisas extras que podem ser úteis:

 getDate() Returns the day of the month (from 1-31) getDay() Returns the day of the week (from 0-6) getFullYear() Returns the year (four digits) getHours() Returns the hour (from 0-23) getMilliseconds() Returns the milliseconds (from 0-999) getMinutes() Returns the minutes (from 0-59) getMonth() Returns the month (from 0-11) getSeconds() Returns the seconds (from 0-59) 

Bom link: MDN Date

Você precisa usar getTime() e setTime() para adicionar ou subtrair a hora em um object Date de javascript. O uso de setDate() e getDate() resultará em erros ao atingir os limites dos meses 1, 30, 31, etc.

Usar setTime permite definir um deslocamento em milissegundos e deixar o object Date calcular o resto:

 var now=new Date(); var yesterdayMs = now.getTime() - 1000*60*60*24*1; // Offset by one day; now.setTime( yesterdayMs ); 
 startdate.setDate(startdate.getDate() - daysToSubtract); startdate.setDate(startdate.getDate() + daysToAdd); 

O object JavaScript Date pode ajudar aqui.

A primeira etapa é converter essas cadeias em instâncias de Date . Isso é feito facilmente:

 var str = "06/07/2012"; // Eg, "mm/dd/yyyy"; var dt = new Date(parseInt(str.substring(6), 10), // Year parseInt(str.substring(0, 2), 10) - 1, // Month (0-11) parseInt(str.substring(3, 5), 10)); // Day 

Então você pode fazer todo tipo de cálculos úteis. Datas JavaScript entendem anos bissextos e tal. Eles usam um conceito idealizado de “dia” que tem exatamente 86.400 segundos de duração. Seu valor subjacente é o número de milissegundos desde a Epoch (meia-noite de 1º de janeiro de 1970); pode ser um número negativo para datas anteriores à Epoch.

Mais na página do MDN na Date .

Você também pode considerar o uso de uma biblioteca como o MomentJS , que ajudará na análise, na data, na formatação …

Pode ser que isso possa ajudar

   ---------------------- UI --------------- 
 //In order to get yesterday's date in mm/dd/yyyy. function gimmeYesterday(toAdd) { if (!toAdd || toAdd == '' || isNaN(toAdd)) return; var d = new Date(); d.setDate(d.getDate() - parseInt(toAdd)); var yesterDAY = (d.getMonth() +1) + "/" + d.getDate() + "/" + d.getFullYear(); $("#endDate").html(yesterDAY); } $(document).ready(function() { gimmeYesterday(1); }); 

você pode tentar aqui: http://jsfiddle.net/ZQAHE/

Trabalhar com datas em javascript é sempre um pouco trabalhoso. Eu sempre acabo usando uma biblioteca. Moment.js e XDate são ótimos:

http://momentjs.com/

http://arshaw.com/xdate/

Violino:

http://jsfiddle.net/39fWa/

 var $output = $('#output'), tomorrow = moment().add('days', 1); $('

').appendTo($output).text(tomorrow); tomorrow = new XDate().addDays(-1); $('


').appendTo($output).text(tomorrow);

Detalhes

Do jeito que eu gosto, é se você tiver um object de data, você pode subtrair outro object de data para obter a diferença. Objetos de data são baseados em milissegundos a partir de uma determinada data.

 var date1 = new Date(2015, 02, 18); // "18/03/2015", month is 0-index var date2 = new Date(2015, 02, 20); // "20/03/2015" var msDiff = date2 - date1; // 172800000, this is time in milliseconds var daysDiff = msDiff / 1000 / 60 / 60 / 24; // 2 days 

Então é assim que você subtrai as datas. Agora, se você quiser adicioná-los? date1 + date2 dá um erro .. Mas se eu quiser ter o tempo em ms eu posso usar:

 var dateMs = date1 - 0; // say I want to add 5 days I can use var days = 5; var msToAdd = days * 24 * 60 * 60 * 1000; var newDate = new Date(dateMs + msToAdd); 

Ao subtrair 0, você transforma o object de data no formato de milissegundos.

Você pode usar o object nativo javascript Date para acompanhar as datas. Ele lhe dará a data atual, permitirá que você acompanhe as coisas específicas do calendar e até mesmo o ajude a gerenciar diferentes fusos horários. Você pode adicionar e subtrair dias / horas / segundos para alterar a data em que está trabalhando ou para calcular novas datas.

dê uma olhada nesta referência de object para aprender mais:

Encontro

Espero que ajude!

Todas essas funções para adicionar data estão erradas. Você está passando o mês errado para a function Data. Mais informações sobre o problema: http://www.domdigger.com/blog/?p=9

Algo que estou usando (jquery necessário), no meu script eu preciso dele para o dia atual, mas é claro que você pode editá-lo de acordo.

HTML:

    

JavaScript:

  var counter = 0; $("#SubtractDay").click(function() { counter--; var today = new Date(); today.setDate(today.getDate() + counter); var formattedDate = new Date(today); var d = ("0" + formattedDate.getDate()).slice(-2); var m = ("0" + (formattedDate.getMonth() + 1)).slice(-2); var y = formattedDate.getFullYear(); $("#dateChange").val(d + "/" + m + "/" + y); }); $("#AddDay").click(function() { counter++; var today = new Date(); today.setDate(today.getDate() + counter); var formattedDate = new Date(today); var d = ("0" + formattedDate.getDate()).slice(-2); var m = ("0" + (formattedDate.getMonth() + 1)).slice(-2); var y = formattedDate.getFullYear(); $("#dateChange").val(d + "/" + m + "/" + y); }); 

jsfiddle

 var date = new Date('your date string here'); // eg '2017-11-21' var newdate = new Date(date.getTime() + 24*60*60*1000 * days) // days is the number of days you want to shift the date by 

Esta é a única solução que funciona de forma confiável ao adicionar / subtrair meses e anos. Percebeu isso depois de passar muito tempo mexendo nos methods getDate e setDate, tentando ajustar os turnos mês / ano.

O decasteljau (neste tópico) já respondeu isso, mas apenas quer enfatizar a utilidade deste método, porque 90% das respostas lá fora recomendam a abordagem getDate e setDate.