2012-06-07 10 views
63

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

Le date nel formato: "gg/mm/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".

Ha bisogno di tenere traccia degli anni bisestili, il numero di giorni del mese, ecc

Tutte le idee?

P.S utilizzando AJAX per ottenere la data dal server non è un'opzione, è un po 'lag e non l'esperienza per l'utente che il cliente vuole.

+1

se si utilizza DatePicker. quindi 'dateValue = $ .datepicker.parseDate (" mm/gg/aa ", '06/01/2012 ');' 'dateValue.setDate (dateValue.getDate() + 1);' –

risposta

83

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

roba extra che potrebbe tornare utile:

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) 

Buono link:MDN Date

+0

Perché creare una terza nuova data : var nd = new Date (newdate) ?? L'oggetto data, newdate, modificato da .setDate va bene, non è vero? –

+0

@KevinM sì, dipende dallo scopo in modo che 'nd' sia una nuova data' var' è stata appena creata per chiarezza! ':) ' –

1

È possibile utilizzare l'oggetto JavaScript Date 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. È possibile aggiungere e sottrarre giorni/ore/secondi per modificare la data in cui si sta lavorando o per calcolare nuove date.

un'occhiata a questo riferimento all'oggetto per saperne di più:

Date

Speranza che aiuta!

14
startdate.setDate(startdate.getDate() - daysToSubtract); 


startdate.setDate(startdate.getDate() + daysToAdd); 
4

Può essere questo potrebbe aiutare

<script type="text/javascript" language="javascript"> 
     function AddDays(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() + parseInt(toAdd)); 

      document.getElementById("result").innerHTML = d.getDate() + "/" + d.getMonth() + "/" + d.getFullYear(); 
     } 

function SubtractDays(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() - parseInt(toAdd)); 

      document.getElementById("result").innerHTML = d.getDate() + "/" + d.getMonth() + "/" + d.getFullYear(); 
     } 
    </script> 
    ---------------------- UI --------------- 
     <div id="result"> 
     </div> 
     <input type="text" value="0" onkeyup="AddDays(this.value);" /> 
     <input type="text" value="0" onkeyup="SubtractDays(this.value);" /> 
6

L'oggetto JavaScript Date può aiutare in questo.

Il primo passo è quello di convertire quelle stringhe di Date istanze. È facile:

var str = "06/07/2012"; // E.g., "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 è possibile eseguire tutti i tipi di calcoli utili. Le date di JavaScript comprendono gli anni bisestili e così via. Usano un concetto idealizzato di "giorno" che è 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.

Maggiori informazioni sul MDN page on Date.

Si potrebbe anche considerare l'utilizzo di una libreria come MomentJS, che contribuirà con l'analisi, facendo della data per la matematica, la formattazione ...

+4

non fare storie con le persone. Basta usare moment.js e salvare i capelli. –

3

Operazioni con data in JavaScript è sempre un po 'di fastidio. Finisco sempre per usare una biblioteca. Moment.js e XDate sono entrambi grandi:

http://momentjs.com/

http://arshaw.com/xdate/

Fiddle:

http://jsfiddle.net/39fWa/

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

$('<pre />').appendTo($output).text(tomorrow); 

tomorrow = new XDate().addDays(-1); 

$('<pre />').appendTo($output).text(tomorrow); 

+0

Ho visto volte quando moment.js calcola un numero non valido di mesi durante un intervallo di date (diff) - ad esempio, tra le date del 13 febbraio 2014 e del 15 marzo 2016 - moment.js segnalerà che ci sono 26 mesi in cui la maggior parte delle lingue con classi Date o DateTime incorporate di qualche tipo riportano lo stesso intervallo di 25. XDate sembra calcolare correttamente tale intervallo. – AndrewPK

4
//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/

32

È necessario utilizzare getTime() e setTime() per aggiungere o sottrarre il tempo in un oggetto JavaScript Date. Utilizzando setDate() e getDate() porterà ad errori quando si raggiunge il limite dei mesi 1, 30, 31, ecc ..

Utilizzando setTime consente di impostare un offset in millisecondi, e lasciare che la figura della data oggetto il resto:

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

Questa è l'unica soluzione che ha funzionato per me. Il costruttore Date sembra comportarsi in modo strano quando viene utilizzato un numero negativo per l'indice del giorno. Ho trovato l'unico modo per risolverlo era lavorare con millisecondi direttamente –

+0

Soluzione migliore !. Tutte le altre soluzioni che usano setDate dovrebbero essere downvoted ... potrebbero avermi fatto un sacco di problemi ... – abimelex

+0

Ditto. Questa è la soluzione più pulita e più affidabile. Grazie @decasteljau – GR7

2

Il modo in cui mi piace, è se si dispone di un oggetto data è possibile sottrarre un altro oggetto 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 

Ecco come si sottraggono le date. Ora se vuoi aggiungerli? date1 + date2 dà 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 accende l'oggetto data nel formato millisecondi.

0

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

HTML:

<label>Date:</label><input name="date" id="dateChange" type="date"/> 
<input id="SubtractDay" type="button" value="-" /> 
<input id="AddDay" type="button" value="+" /> 

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

0
var date = new Date('your date string here'); // e.g. '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/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 questa discussione) ha già risposto a questa domanda, ma desidera semplicemente sottolineare l'utilità di questo metodo poiché il 90% delle risposte consiglia l'approccio getDate e setDate.