Berechnen Sie das gestrige Datum in JavaScript

277

Wie kann ich gestern als Datum in JavaScript berechnen ?

Omega
quelle

Antworten:

456
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)
James Kyburz
quelle
12
Nett. Auf den ersten Blick scheint dies fehlzuschlagen, da getDateder Tag des Monats zurückgegeben wird (z. B. 1 - 31), setDate(0)das Datum jedoch tatsächlich auf den letzten Tag des Vormonats gesetzt wird. Funktioniert dies jedoch in allen Browsern?
Drew Noakes
1
Konnte nicht "alle" Browser überprüfen, funktionierte aber in allen von mir getesteten camo.githubusercontent.com/…
James Kyburz
1
@ Zargold Verstehe nicht was du meinst. node --version v9.4.0 node const date = new Date () undefined> date.toISOString () '2018-02-10T16: 26: 30.821Z'> date.setDate (date.getDate () - 1) 1518193590821> date .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz
Hmm ja, habe es gerade direkt getestet und du hast Recht, ich bin mir nicht sicher, wie mein Anwendungsfall anders war und habe es seitdem komplett überarbeitet. Also werde ich nicht sehen können.
Zargold
91

Nicht sehr effizient, aber als Oneliner:

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

Das Obige schafft drei DateObjekte, was unnötig verschwenderisch ist. Dies kann auf eine einzige Instanziierung reduziert werden mit:

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

Oder wenn Sie es vorziehen:

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

Oder wenn Sie ES6 mit Pfeilfunktion bevorzugen:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);
KooiInc
quelle
6
Ich würde es vorziehen, nicht mit dem Umfang herumzuspielen:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker
3
Wenn Sie einen Einzeiler benötigen, verwenden Sie ein neues Datum (Date.now () - 24 * 60 * 60 * 1000). Dies hat den Vorteil, dass nur ein Datumsobjekt erstellt wird. Aber ehrlich gesagt, wer diesen Code verwaltet, wird viel glücklicher sein, die klare 2-Zeilen-Version zu sehen, als etwas, das Funktionen herumwirft (oder Millisekunden).
Rob Whelan
65

Versuche dies

var d = new Date();
d.setDate(d.getDate() - 1);
ashishjmeshram
quelle
1
Nächster Befehl d.setHours (19,59); Um die Zeit auf 19:59 Uhr einzustellen
James Jenkins
60

Überraschenderweise gibt es keinen Antwortpunkt auf die einfachste Cross-Browser-Lösung

Um genau die gleiche Zeit gestern zu finden:

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

Das ist, wenn Sie abhängigkeitsfrei gehen möchten, sonst würde ich empfehlen, http://momentjs.com zu verwenden

Fabiano Soriani
quelle
7
Wie funktioniert das, wenn sich die Sommerzeit ändert? Würde das nicht vor / nach einer Stunde stoßen?
Adam Tegen
19

Um die Frage zu verallgemeinern und andere Diff-Berechnungen durchzuführen, verwenden Sie:

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

Dadurch wird ein neues Datumsobjekt erstellt, das auf dem Wert "now" als Ganzzahl basiert und die Unix-Epoche in Millisekunden darstellt, wobei ein Tag abgezogen wird.

Vor zwei Tagen:

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

Vor einer Stunde:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);
Ami Heines
quelle
Dies scheint die sicherste Methode zu sein, da wir mit einer Unix-Epoche arbeiten, die in Millisekunden ausgedrückt wird. Die Arithmetik ist also sicherer als getDate () - 1. Ich habe getDate () - 1 nicht ausprobiert, aber basierend auf der Dokumentation von getDate () wird 1 zurückgegeben, wenn das heutige Datum der 1. eines Monats ist. Und 1-1 = 0 ist kein gültiges Datum. Ich bin mir nicht sicher, wie setDate (0) funktioniert.
Kapil Pendse
1
Dies war mein Ansatz, obwohl Sie ihn auch ein wenig vereinfachen können - versuchen Sie etwas wie ein neues Datum (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan
setDate (0) wäre übrigens in Ordnung - es würde zum letzten Tag des Vormonats wechseln. Aber es scheint mir ordentlicher (und intuitiver) zu sein, die Millisekunden-Darstellung hier fallen zu lassen - der einzige Nachteil ist, dass die "Anzahl der Millis pro Tag" nicht so offensichtlich ist, so dass es leicht sein könnte, diese Berechnung falsch zu tippen.
Rob Whelan
Das Arbeiten mit Unix-Zeit scheint die zuverlässigere Option zu sein. Dies sollte höher bewertet werden.
Paul
Ja, ich mag diesen Ansatz am besten. Es gibt weniger Mehrdeutigkeiten. Am Ende ging ich mit new Date(Date.parse(new Date()) - 86400000). Obwohl ich Date.now () mag, versuche ich es vielleicht stattdessen. Es wird ein zusätzliches Datum gespeichert.
Coblr
9

Ich benutze Moment Library, es ist sehr flexibel und einfach zu bedienen.

In deinem Fall:

let yesterday = moment().subtract(1, 'day').toDate();
Guyaloni
quelle
2
Sie sollten besser subtractanstelle vonadd
Thomas Ayoub
Funktioniert auch gut! Gute Arbeit für ng FullCalendar und seine validRange
XenoX
8
new Date(new Date().setDate(new Date().getDate()-1))
Gopinath Radhakrishnan
quelle
3
Könnten Sie ein bisschen Erklärung hinzufügen? Einfache Codeblöcke allein sind nicht
allzu
Funktioniert gut ! Vielen Dank
XenoX
7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);
Billyhomebase
quelle
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);

Deepu Reghunath
quelle
5

Dies wird gestern um 00:00 Uhr mit Minutengenauigkeit produziert

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);
Evgeni Makarov
quelle
2
d.setHours(0,0,0,0);

wird den Trick machen

godzillante
quelle
1
Wird es? Ich dachte, dies setzt nur Ihre Stunden, Minuten und Sekunden auf 0, ändert aber nicht das Datum?
Jesper Bylund
Ich musste negative Zahlen verwenden, um zu gestern zu gelangen : d.setHours(-1,0,0,0). Dies wird das gestrige Datum zurückgeben, aber es ist möglicherweise nicht die gewünschte Zeit (23:00:00)
cs_pupil
1

Probieren Sie es aus, funktioniert für mich:

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

Dies brachte mir ein Datumsobjekt für gestern zurück

Ken Ye
quelle
1
Da Sie today.setDate verwenden, ändert sich heute auch zu gestern. Es ist besser, die Variable von gestern zu erstellen und sie dann festzulegen. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)So können Sie sowohl heute als auch gestern verwenden
PersyJack
1

Hier ist ein Einzeiler, der verwendet wird, um das gestrige Datum im Format JJJJ-MM-TT im Text abzurufen und den Zeitzonenversatz zu verarbeiten.

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

Es kann offensichtlich auf das Rückgabedatum geändert werden, x Tage zurück in der Zeit. Zeit usw. einbeziehen.

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

Greif
quelle
0

Wenn Sie sowohl das Datum für gestern abrufen als auch dieses Datum in einem für Menschen lesbaren Format formatieren möchten, sollten Sie ein benutzerdefiniertes DateHelperObjekt erstellen , das ungefähr so ​​aussieht:

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

(siehe auch diese Geige )

John Slegers
quelle
0

Sie können momentjs verwenden. Es ist sehr hilfreich, mit dieser Bibliothek viele Dinge zu erreichen.

Holen Sie sich das gestrige Datum mit dem aktuellen Timing moment().subtract(1, 'days').toString()

Holen Sie sich das Datum von gestern mit einem Beginn des Datums moment().subtract(1, 'days').startOf('day').toString()

Abhishek Kumar Pandey
quelle
0

Problem mit dem Grenzdatum lösen (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);
Eric Chan
quelle
-1

"Date.now () - 86400000" funktioniert am Endtag der Sommerzeit (der an diesem Tag 25 Stunden hat) nicht.

Eine weitere Option ist die Verwendung von Closure:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
user10605953
quelle