Come aggiungere / sottrarre date con JavaScript?

Voglio consentire agli utenti di aggiungere e sottrarre facilmente le date utilizzando JavaScript per sfogliare le loro voci per data.

Le date sono nel formato: “mm / gg / aaaa”. Voglio che siano in grado di fare clic su un pulsante “Avanti”, e se la data è: “06/01/2012”, quindi facendo clic su Avanti, dovrebbe diventare: “06/02/2012”. Se fanno clic sul pulsante “prev”, dovrebbe diventare “31/05/2012”.

È necessario tenere traccia degli anni bisestili, del numero di giorni nel mese, ecc.

Qualche idea?

PS utilizzando AJAX per ottenere la data dal server non è un’opzione, è un po ‘laggy e non l’esperienza per l’utente che il cliente vuole.

Codice:

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

JSFiddle Demo

Utilizzando 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();​ 

JSFiddle Demo

Cose extra che potrebbero tornare utili:

 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) 

Buon link: Data MDN

È necessario utilizzare getTime() e setTime() per aggiungere o sottrarre l’ora in un object Date javascript. L’utilizzo di setDate() e getDate() causerà errori quando si raggiungono i limiti dei mesi 1, 30, 31, ecc.

L’utilizzo di setTime consente di impostare un offset in millisecondi e lasciare che l’object Date ricominci il 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); 

L’object Date JavaScript può aiutare qui.

Il primo passaggio consiste nel convertire tali stringhe in istanze Date . Questo è facile:

 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 

Quindi puoi fare tutti i tipi di calcoli utili. Le date di JavaScript comprendono gli anni bisestili e così via. Usano un concetto idealizzato di “giorno” che è lungo esattamente 86.400 secondi. Il loro valore sottostante è il numero di millisecondi da The Epoch (mezzanotte, 1 gennaio 1970); può essere un numero negativo per date precedenti a The Epoch.

Altro sulla pagina MDN su Date .

Potresti anche prendere in considerazione l’utilizzo di una libreria come MomentJS , che ti aiuterà nell’analisi , nell’esecuzione della matematica delle date, nella formattazione …

Potrebbe essere questo potrebbe aiutare

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

puoi provare qui: http://jsfiddle.net/ZQAHE/

Lavorare con le date in javascript è sempre un po ‘complicato. Finisco sempre per usare una biblioteca. Moment.js e XDate sono entrambi fantastici:

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

Il modo in cui mi piace, è che se hai un object data puoi sottrarre un altro object data da esso per ottenere la differenza. Gli oggetti data sono basati su millisecondi a partire da una certa 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 

Quindi questo è come sottrai le date. Ora se vuoi aggiungerli? date1 + date2 restituisce un errore .. Ma se voglio ottenere il tempo in ms posso usare:

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

Sottraendo 0 si gira l’object data nel formato millisecondi.

È ansible utilizzare l’object data javascript nativo per tenere traccia delle date. Ti darà la data corrente, ti permetterà di tenere traccia delle cose specifiche del calendario e persino di aiutarti a gestire diversi fusi orari. È ansible aggiungere e sottrarre giorni / ore / secondi per modificare la data in cui si sta lavorando o per calcolare nuove date.

dai un’occhiata a questo riferimento all’object per saperne di più:

Data

Spero possa aiutare!

Tutte queste funzioni per aggiungere la data sono sbagliate. Stai passando il mese sbagliato alla funzione Date. Ulteriori informazioni sul problema: http://www.domdigger.com/blog/?p=9

Qualcosa che sto usando (jquery necessario), nel mio script ne ho bisogno per il giorno corrente, ma ovviamente puoi modificarlo di conseguenza.

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 

Questa è l’unica soluzione che funziona in modo affidabile durante l’aggiunta / la sottrazione tra mesi e anni. Realizzato questo dopo aver passato troppo tempo a giocare con i metodi getDate e setDate, cercando di adattarsi ai cambiamenti mese / anno.

decasteljau (in questo thread) ha già risposto a questo, ma voglio solo enfatizzare l’utilità di questo metodo perché il 90% delle risposte suggeriscono l’approccio getDate e setDate.