Was ist der beste Weg, um ein JavaScript-Datum auf Mitternacht zu initialisieren?

438

Was ist der einfachste Weg, um eine Instanz von new Date () zu erhalten, aber die Uhrzeit auf Mitternacht einzustellen?

Sixty4Bit
quelle

Antworten:

871

Das setHoursVerfahren kann optional nehmen minutes, secondsund msArgumente, zum Beispiel:

var d = new Date();
d.setHours(0,0,0,0);

Das wird die Zeit einzustellen , 00:00:00.000von Ihrer aktuellen Zeitzone , wenn Sie zur Arbeit in UTC - Zeit wollen, können Sie das verwenden setUTCHoursMethode.

CMS
quelle
41
Zu Ihrer Information, ich führe diese Methode (d.setHours (0,0,0,0)) in einer Reduzierungsfunktion für 270K-Zeilen aus und sie ist über 20 Sekunden schneller als d.setHours (0). d.setMinutes (0); d.setSeconds (0); Tolle Antwort @CMS!
Jbnunn
32
Dies muss in zwei Zeilen erfolgen, um d als Datumsobjekt zu behalten. Ich habe kürzlich einen Fehler behoben, der dies in einer Zeile tat: var d = new Date (). SetHours (0, 0, 0, 0). D war dann jedoch eine Zahl, kein Datum, da setHours eine Zahl zurückgibt.
Jason
9
Ich bin gerade darauf gestoßen (spät zu der Party, die ich kenne) und brauche auch eine einzeilige Lösung, die ein Datum zurückgibt. Für alle, die danach suchen, funktioniert die Antwort von @ Zon perfekt : new Date(new Date().setHours(0,0,0,0)).
SRack
226

Ich wollte nur klarstellen, dass der Ausschnitt aus der akzeptierten Antwort die nächste Mitternacht in der Vergangenheit angibt :

var d = new Date();
d.setHours(0,0,0,0); // last midnight

Wenn Sie in Zukunft die nächste Mitternacht erhalten möchten , verwenden Sie den folgenden Code:

var d = new Date();
d.setHours(24,0,0,0); // next midnight
Dan
quelle
6
Was passiert, wenn der heutige Tag 25 Stunden lang ist (die Uhren stellen sich auf Sommerzeit ein)?
Qntm
8
Dies ist ein clientseitiges Skript, Mitternacht ist Mitternacht, trotz Sommerzeit. Ebenfalls bemerkenswert zu erwähnen. Nicht jeder Ort auf der Welt verwendet Sommerzeit (Sommerzeit)
Chris
2
@qntm: Die Änderung der Sommerzeit wird immer zwischen 2 und 4 Uhr morgens angewendet, so dass es an diesem Tag nur eine Mitternacht ist :). Aber ja, 3 Uhr morgens kann zweimal am Tag passieren (Gesichtspalme)
Dan
@chris Nein, ich meine das zweite Snippet. "24 Stunden nach Mitternacht heute" ist nicht immer dasselbe wie "Mitternacht morgen". Funktioniert in diesen Fällen das zweite Snippet?
Qntm
3
@qntm: Date.setHours fügt nicht blind 24 Stunden hinzu, es ist intelligenter. Stattdessen wird ein Zeitstempel des Augenblicks zurückgegeben, in dem die Uhr beim nächsten Mal 24 anzeigt. Zeitersparnis berücksichtigen. Versuchen Sie, selbst in der Konsole zu spielen. Interessanterweise gibt setHours (25) den Zeitstempel des morgigen 1 Uhr morgens
Dan
68

Ein Einzeiler für Objektkonfigurationen:

new Date(new Date().setHours(0,0,0,0));

Beim Erstellen eines Elements:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}
Zon
quelle
6
Vielen Dank! Ich habe mich gefragt, wie ich es in einer einzigen Zeile machen kann, weil ich eine Objekteigenschaft gesetzt habe! Gute Antwort.
Paulo Roberto Rosa
Danke Zon, das hat mir geholfen, es einzeilig zu schreiben.
HungrySoul
22

Ich werde dies hier nur hinzufügen, weil ich auf dieser Seite gelandet bin und nach Möglichkeiten gesucht habe, dies in moment.js zu tun und und anderen zu tun.

[Begründung: Das Wort "Moment" erscheint bereits an anderer Stelle auf dieser Seite, daher suchen Suchmaschinen direkt hier und moment.js ist weit genug verbreitet, um zu , dass es behandelt wird, wie oft es in anderen SO-Fragen erwähnt wird.]

Also, in Version 2.0.0 und höher:

date.startOf('day');

Für frühere Versionen:

date.sod();

Docs:

http://momentjs.com/docs/#/manipulating/start-of/

andyhasit
quelle
Um ein moment(DATE_OBJECT).startOf('day').toDate();
Datumsobjekt
2
Ja, lassen Sie uns eine 52-KB-Javascript-Bibliothek hinzufügen, um etwas zu tun, das Sie in zwei Zeilen tun können.
Bruce Lim
19
Und was ist, wenn Sie moment.js bereits aus einem der vielen guten Gründe verwenden, die Sie möglicherweise ...? Wie wäre es, wenn Sie die Begründung lesen, die ich gegeben habe, bevor Sie einen sarkastischen Kommentar hinzufügen?
andyhasit
11

Sie können wahrscheinlich verwenden

new Date().setUTCHours(0,0,0,0)

wenn Sie den Wert nur einmal benötigen.

Stan
quelle
1
Dies erhält keine Instanz eines Datums, wie es das OP erfordert.
Cobberboy
Dies ist definitiv die beste Antwort, erfordert jedoch eine kleine Bearbeitung, um eine Instanz eines Datums zurückzugeben. neues Datum (neues Datum (). setUTCHours (0, 0, 0, 0));
VitFL
4

Um das Beispiel von @ Dan noch nützlicher zu machen, musste ich den nächsten Mittag oder Mitternacht finden.

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

Auf diese Weise konnte ich eine Frequenzobergrenze für ein Ereignis festlegen, die für jeden Besucher meiner Website nur einmal am Morgen und einmal am Nachmittag erfolgen konnte. Das erfasste Datum wurde verwendet, um den Ablauf des Cookies festzulegen.

jamis0n
quelle
4

Wenn Sie mit Daten rechnen, verursacht die Sommerzeit häufig 1 Stunde mehr oder eine Stunde weniger als Mitternacht (MESZ). Dies führt zu einer Differenz von 1 Tag, wenn die Daten zurückkehren. Die Daten müssen also auf Mitternacht gerundet werden. Der Code lautet also (ths to jamisOn):

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }
user3887038
quelle
3

Ich habe ein paar Prototypen gemacht, um das für mich zu erledigen.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

Wenn Sie den Sicherheitscheck nicht möchten, können Sie ihn einfach verwenden

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

Anwendungsbeispiel:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());
Mike
quelle
2

Falls Sie d3.js bereits als Abhängigkeit in Ihrem Projekt haben oder es Ihnen nichts ausmacht, es einzubringen , hat d3-time ( die Bibliothek von d3.js ist ab Version 4.0.0 modular aufgebaut ) Intervalle .

Sie können sich als nützlich erweisen, wenn Datumsangaben auf "Standard" -Werte gesetzt werden, z. B. Mitternacht, 0,00 Sekunden, der erste des Monats usw.

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)
Peemster
quelle
Daher habe ich einen Trend bei JavaScript-bezogenen Fragen festgestellt, die auf SO veröffentlicht wurden: Unabhängig von der Komplexität der Lösungen, die mit nativem JS vorgeschlagen werden, werden alle Antworten, die das Problem mithilfe einer externen Bibliothek beheben, zwangsläufig irgendwann abgelehnt. Als ich dies erkannte, bemühte ich mich, meine Antwort mit dem kurzen Vorwort zu veröffentlichen: Falls Sie bereits example.js als Abhängigkeit haben . Und doch der Downvote, anonymer SO-User? das tut weh, Mann: '- (
Peemster
Ich bin der Meinung, dass diese Antwort nicht abgelehnt werden sollte, zumal derjenige, der die Verwendung von moment.js vorschlägt, 16 Stimmen hat (zum Zeitpunkt des Schreibens dieses Kommentars). Es löst das Problem auf sehr präzise und nicht so offensichtliche Weise.
lukeatdesignworks