Incrementare una data in JavaScript


Risposte:


792

Tre opzioni per te:

1. Utilizzando solo l' Dateoggetto JavaScript (no librerie):

La mia precedente risposta per il n. 1 era errata (ha aggiunto 24 ore, non riuscendo a tenere conto delle transizioni da e verso l'ora legale; Clever Human ha sottolineato che avrebbe fallito con il 7 novembre 2010 nel fuso orario orientale). Invece, la risposta di Jigar è il modo corretto di farlo senza una libreria:

var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);

Funziona anche per l'ultimo giorno di un mese (o anno), poiché l'oggetto data JavaScript è intelligente riguardo al rollover:

(Questa risposta è attualmente accettata, quindi non posso eliminarla. Prima che fosse accettata, ho suggerito all'OP che accettano Jigar, ma forse hanno accettato questa per gli articoli 2 o 3 dell'elenco.)

2. Utilizzo di MomentJS :

var today = moment();
var tomorrow = moment(today).add(1, 'days');

(Attenzione add modificare l'istanza su cui la chiami, piuttosto che restituire una nuova istanza, quindi today.add(1, 'days')cambierebbe today. Ecco perché iniziamo con un'operazione di clonazione attiva var tomorrow = ....)

3. Utilizzo di DateJS , ma non è stato aggiornato da molto tempo:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

Ma ho una data 2010-09-11 in una variabile usando document.getElementById ("arrival_date"). Valore, mostra data non valida
Santanu

1
@santanu: Questo è un problema completamente diverso: analisi della data (ottenere una data interpretando una stringa). Se quel formato è statico, puoi analizzarlo tu stesso e inserire i risultati nel Datecostruttore ( new Date(year, month, date)); vedere la sezione 15.9.2.1 del disciplinare ; se vuoi accettare una vasta gamma di formati, dai un'occhiata a DateJS .
TJ Crowder,

1
@santanu: solo per dare seguito a quanto sopra: alcuni browser potrebbero analizzare correttamente quel formato Date.parse(che restituisce un numero di millisecondi in cui puoi quindi inserire new Date(ms)). Ma attenzione, che può variare da browser a browser. Fino a poco tempo fa, le implementazioni potevano fare praticamente qualsiasi cosa volessero Date.parse. La nuova specifica per la 5a edizione ha ora un formato minimo che deve essere accettato, ma non ci contare ancora.
TJ Crowder,

Volevo solo aggiungere un secondo a un'istanza di Date; questo ha funzionato per me x = new Date(); x2 = new Date(x.getTime() + 1000), dove 1000 è un incremento di millisecondi.
berto

1
@piavgh: non c'è niente di sbagliato nella prima soluzione, è proprio come la stai usando. Dategli oggetti sono mutabili. Stai memorizzando lo stesso Date oggetto tre volte nell'array. Se vuoi tre Dateoggetti diversi , devi creare tre oggetti:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
TJ Crowder,

178
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Ma ho una data 2010-09-11 in una variabile usando document.getElementById ("arrival_date"). Valore, mostra data non valida
Santanu

1
@sanatu: in tal caso è necessario formattare la stringa in modo che il browser accetti. Chrome accetta new Date("2009-09-11")ma Firefox no. Penso che la maggior parte dei browser accetti new Date("2009/09/11")così sarebbe una soluzione semplice var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund,

5
Un approccio più solido di sostituire -con /e sperando che i browser lo accetteranno, sarebbe quella di dividere la stringa in parti: var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1);Si noti che stiamo usando m-1qui, perché mesi javascript sono valori enum (gennaio essendo 0, non 1), e d+1perché noi stai facendo l'incremento già nell'assegnazione iniziale (si correggerà automaticamente per il 29 febbraio, ecc.)
David Hedlund

35

Nessuno degli esempi in questa risposta sembra funzionare con i giorni di regolazione dell'ora legale. In quei giorni, il numero di ore in un giorno non è 24 (sono 23 o 25, a seconda che tu stia "balzando in avanti" o "cadendo indietro").

Di seguito la funzione javascript AddDays tiene conto dell'ora legale:

function addDays(date, amount) {
  var tzOff = date.getTimezoneOffset() * 60 * 1000,
      t = date.getTime(),
      d = new Date(),
      tzOff2;

  t += (1000 * 60 * 60 * 24) * amount;
  d.setTime(t);

  tzOff2 = d.getTimezoneOffset() * 60 * 1000;
  if (tzOff != tzOff2) {
    var diff = tzOff2 - tzOff;
    t += diff;
    d.setTime(t);
  }

  return d;
}

Ecco i test che ho usato per testare la funzione:

    var d = new Date(2010,10,7);
    var d2 = AddDays(d, 1);
    document.write(d.toString() + "<br />" + d2.toString());

    d = new Date(2010,10,8);
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, 1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

33

Il modo più semplice è convertire in millisecondi e aggiungere 1000 * 60 * 60 * 24 millisecondi, ad esempio:

var tomorrow = new Date(today.getTime()+1000*60*60*24);

Adoro questa regola di rappresentazione intera.
exebook

Questa è la risposta migliore Può aumentare / diminuire facilmente tutti i giorni richiesti; semplicemente moltiplicando 1000*60*60*24xDaysToBeAdded
Khalil Khalaf il

Oppure, new Date(+new Date() + 1000*60*60*24)ma in realtà è simile a getTime()/ setTime(), davvero.
Polv,

1
Non farlo a meno che la tua data non sia in UTC o in un altro fuso orario che non ha l'ora legale. Altrimenti, per 2 giorni all'anno, darà risultati inaspettati.
ItalyPaleAle

Un one-liner:new Date(Date.now()+1000*60*60*24);
aiyan,

28

Domani in una riga in puro JS ma è brutto !

new Date(new Date().setDate(new Date().getDate() + 1))

Ecco il risultato:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)

14

Devi prima analizzare la tua stringa prima di seguire il suggerimento delle altre persone:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Se lo desideri di nuovo nello stesso formato, dovrai farlo "manualmente":

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

Ma suggerisco di ottenere Date.js come menzionato in altre risposte, che ti aiuterà molto .


7

Sento che nulla è più sicuro di .getTime()e .setTime(), quindi questo dovrebbe essere il migliore e anche performante.

const d = new Date()
console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS

.setDate() per data non valida (come 31 + 1) è troppo pericoloso e dipende dall'implementazione del browser.


5

Ottenere i prossimi 5 giorni:

var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();


for(i=0; i < 5; i++){
var curdate = new Date(y, m, d+i)
console.log(curdate)
}

Ho provato le risposte sopra ma invano. Il tuo codice ha funzionato come un fascino. Grazie!
dimmat,

4

Due metodi:

1:

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)

2: simile al metodo precedente

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)


2
 Date.prototype.AddDays = function (days) {
    days = parseInt(days, 10);
    return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
}

Esempio

var dt = new Date();
console.log(dt.AddDays(-30));
console.log(dt.AddDays(-10));
console.log(dt.AddDays(-1));
console.log(dt.AddDays(0));
console.log(dt.AddDays(1));
console.log(dt.AddDays(10));
console.log(dt.AddDays(30));

Risultato

2017-09-03T15:01:37.213Z
2017-09-23T15:01:37.213Z
2017-10-02T15:01:37.213Z
2017-10-03T15:01:37.213Z
2017-10-04T15:01:37.213Z
2017-10-13T15:01:37.213Z
2017-11-02T15:01:37.213Z

Il tuo codice non funziona. L'ho provato con il primo console.log () e dice: dt.AddDays () non è una funzione.
Adrian2895,

1

Non sono del tutto sicuro se si tratta di un BUG (testato Firefox 32.0.3 e Chrome 38.0.2125.101), ma il seguente codice fallirà sul Brasile (-3 GMT):

Date.prototype.shiftDays = function(days){    
  days = parseInt(days, 10);
  this.setDate(this.getDate() + days);
  return this;
}

$date = new Date(2014, 9, 16,0,1,1);
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");

Risultato:

Fri Oct 17 2014 00:01:01 GMT-0300
Sat Oct 18 2014 00:01:01 GMT-0300
Sat Oct 18 2014 23:01:01 GMT-0300
Sun Oct 19 2014 23:01:01 GMT-0200

Aggiungendo un'ora alla data, funzionerà perfettamente (ma non risolve il problema).

$date = new Date(2014, 9, 16,0,1,1);

Risultato:

Fri Oct 17 2014 01:01:01 GMT-0300
Sat Oct 18 2014 01:01:01 GMT-0300
Sun Oct 19 2014 01:01:01 GMT-0200
Mon Oct 20 2014 01:01:01 GMT-0200

1

Risultati in una rappresentazione in formato stringa della data di domani. Utilizzare new Date () per ottenere la data odierna, aggiungendo un giorno usando Date.getDate () e Date.setDate () e convertendo l'oggetto Date in una stringa.

  const tomorrow = () => {
      let t = new Date();
      t.setDate(t.getDate() + 1);
      return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
        t.getDate()
      ).padStart(2, '0')}`;
    };
    tomorrow();

1

Anno di data incrementale con vaniglia js:

start_date_value = "01/01/2019"
var next_year = new Date(start_date_value);
next_year.setYear(next_year.getYear() + 1);
console.log(next_year.getYear()); //=> 2020

Nel caso in cui qualcuno desideri incrementare un valore diverso dalla data (giorno)


1

Tramite JS nativo, per aggiungere un giorno è possibile effettuare le seguenti operazioni:

let date = new Date(); // today
date.setDate(date.getDate() + 1) // tomorrow

Un'altra opzione è utilizzare la momentlibreria:

const date = moment().add(14, "days").toDate()

1
Per favore, spiega cosa fa questo codice. Aggiungi dettagli su come risolve il problema del PO.
Yash,

1

Incremento della data di rilevamento di fuso orario / ora legale per le date JavaScript:

function nextDay(date) {
    const sign = v => (v < 0 ? -1 : +1);
    const result = new Date(date.getTime());
    result.setDate(result.getDate() + 1);
    const offset = result.getTimezoneOffset();
    return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.