Calcola la data di ieri in JavaScript


279

Come posso calcolare ieri come una data in JavaScript?

Risposte:


458
var date = new Date();

date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)

date.setDate(date.getDate() - 1);

date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)

12
Bello. A prima vista, potrebbe sembrare che ciò non vada a buon fine poiché getDaterestituisce il giorno del mese (ad es. 1 - 31), ma setDate(0)imposta effettivamente la data sull'ultimo giorno del mese precedente. Funziona su tutti i browser però?
Drew Noakes,

1
Impossibile verificare "tutti" i browser ma ho funzionato in tutti i test provati camo.githubusercontent.com/…
James Kyburz

1
@Zargold Non capisco cosa intendi. nodo --version v9.4.0 nodo const date = new Date () non definito> date.toISOString () '2018-02-10T16: 26: 30.821Z'> date.setDate (date.getDate () - 1) 1518193590821> data .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz

Hmm, sì, l'ho appena testato direttamente e hai ragione, non sono sicuro di come il mio caso d'uso sia stato diverso e da allora ho completamente rifatturato. Quindi non sarò in grado di vedere.
Zargold,

91

Non molto efficiente, ma come oneliner:

var yesterday = new Date(new Date().setDate(new Date().getDate()-1));

Quanto sopra crea tre Dateoggetti inutilmente inutili. Questo può essere ridotto a una singola istanza con:

var yesterday = (function(){this.setDate(this.getDate()-1); return this})
                  .call(new Date)

Oppure, se preferisci:

var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)

Oppure, se si preferisce ES6 con la funzione freccia:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);

6
Preferirei evitare di perdere tempo:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker,

4
Se hai bisogno di una riga, usa qualcosa come la nuova Data (Date.now () - 24 * 60 * 60 * 1000); questo ha il vantaggio di creare un solo oggetto Date. Ma onestamente, chiunque mantenga questo codice sarà molto più felice di vedere la chiara versione a 2 righe di quanto farebbe qualcosa lanciando funzioni (o millisecondi, del resto).
Rob Whelan,


60

Sorprendentemente nessuna risposta punta alla soluzione cross browser più semplice

Per trovare esattamente la stessa ora ieri:

var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000

Cioè se vuoi liberarti dalla dipendenza, altrimenti ti consiglio di usare http://momentjs.com


7
Come funziona quando cambia l'ora legale? Non sarebbe urtarlo avanti / indietro di un'ora?
Adam Tegen,

19

Per generalizzare la domanda e fare altri calcoli diff utilizzare:

var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);

questo crea un nuovo oggetto data basato sul valore di "now" come numero intero che rappresenta l'epoca unix in millisecondi sottraendo un giorno.

Due giorni fa:

var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);

Un'ora fa:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);

Questo sembra essere il metodo più sicuro in quanto stiamo operando su un'epoca unix espressa in millisecondi. Quindi l'aritmetica è più sicura che fare qualcosa come getDate () - 1. Non ho provato getDate () - 1, ma in base alla documentazione di getDate (), restituirà 1 se la data di oggi è il 1 ° di ogni mese. E 1-1 = 0 non è una data valida. Non sono sicuro di come setDate (0) funzionerà.
Kapil Pendse,

1
Questo è stato il mio approccio, anche se puoi anche semplificarlo un po '- prova qualcosa come il nuovo Date (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan,

setDate (0), a proposito, andrebbe bene - passerebbe all'ultimo giorno del mese precedente. Ma mi sembra più ordinato (e più intuitivo) abbandonare la rappresentazione in millisecondi qui, per me - l'unico aspetto negativo è che "il numero di millis in un giorno" non è così ovvio, quindi potrebbe essere facile sbagliare a digitare quel calcolo.
Rob Whelan,

Lavorare con unix time sembra l'opzione più affidabile. Questo dovrebbe essere valutato più in alto.
Paul,

Sì, mi piace questo approccio al meglio. C'è meno ambiguità. Ho finito per andare con new Date(Date.parse(new Date()) - 86400000). Anche se mi piace Date.now () quindi forse ci proverò invece. Ti farà risparmiare una data in più.
coblr

9

Uso la libreria moment , è molto flessibile e facile da usare.

Nel tuo caso:

let yesterday = moment().subtract(1, 'day').toDate();

2
faresti meglio a usare subtractinvece diadd
Thomas Ayoub

Funziona bene anche! Bel lavoro per FullCalendar e la sua gamma valida
XenoX,


7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);

6

var today = new Date();
var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
var yesterday2 = new Date(Date.now() - 86400000);
var yesterday3 = new Date(Date.now() - 1000*60*60*24);
var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
console.log("Today: "+today);
console.log("Yesterday: "+yesterday1);
console.log("Yesterday: "+yesterday2);
console.log("Yesterday: "+yesterday3);
console.log("Yesterday: "+yesterday4);


5

Questo produrrà ieri alle 00:00 con precisione dei minuti

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);

2
d.setHours(0,0,0,0);

farà il trucco


1
Sara? Ho pensato che questo imposta solo ore, minuti e secondi su 0, ma in realtà non cambia la data?
Jesper Bylund,

Ho dovuto usare i numeri negativi per arrivare a ieri: d.setHours(-1,0,0,0). Questo restituirà la data di ieri, ma potrebbe non essere l'orario desiderato (23:00:00)
cs_pupil

1

Prova questo, funziona per me:

var today = new Date();
var yesterday = new Date(today.setDate(today.getDate() - 1)); `

Mi ha restituito un oggetto datato per ieri


1
Dal momento che stai usando today.setDate, anche oggi cambierà a ieri. È meglio creare la variabile di ieri e quindi impostarla. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)così puoi usare sia oggi che ieri
PersyJack

1

Ecco una riga che viene utilizzata per ottenere la data di ieri in formato AAAA-MM-GG nel testo e gestire l'offset del fuso orario.

new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]

Può essere ovviamente modificato alla data di ritorno, x giorni indietro nel tempo. Per includere tempo ecc.

console.log(Date())
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"

// that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000


0

Se vuoi sia ottenere la data di ieri sia formattarla in un formato leggibile, considera la possibilità di creare un DateHelperoggetto personalizzato che assomigli a questo:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 1 day
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

(vedi anche questo violino )


0

Puoi usare momentjs, è molto utile poter ottenere molte cose con questa libreria.

Ottieni la data di ieri con i tempi attuali moment().subtract(1, 'days').toString()

Ottieni la data di ieri con l'inizio della data moment().subtract(1, 'days').startOf('day').toString()


0

risolvere il problema della data limite (2020, 01, 01) -> 2019, 12, 31

var now = new Date();
return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                now.getDate() - 1);

-1

"Date.now () - 86400000" non funzionerà il giorno di fine dell'ora legale (che ha 25 ore quel giorno)

Un'altra opzione è utilizzare la chiusura:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
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.