Wie bekomme ich Start und Ende des Tages in Javascript?

271

Wie bekomme ich den Start (00:00:00) und das Ende (23:59:59) des heutigen Tages im Zeitstempel (GMT)? Computer verwenden eine Ortszeit.

Bdfy
quelle

Antworten:

525
var start = new Date();
start.setHours(0,0,0,0);

var end = new Date();
end.setHours(23,59,59,999);

alert( start.toUTCString() + ':' + end.toUTCString() );

Wenn Sie die UTC-Zeit von diesen erhalten möchten, können Sie verwenden UTC().

Tvanfosson
quelle
24
Ich würde empfehlen, dass, var end = new Date(start.getTime());um sicherzustellen, dass Sie den gleichen Zeitpunkt haben - falls Sie die Daten zwischen Start- und Endinitialisierung ändern - es passieren kann - nur eine gute Angewohnheit, sich darauf einzulassen
Martyn Davis
@MartynDavis Wenn alles normal ist, treten normalerweise etwa 0-2 Ticks dazwischen auf, aber es hängt davon ab, wie beschäftigt die CPU ist. Dann ist es sinnvoll, dies zu tun, wenn Sie sich Sorgen um die Genauigkeit von 1 Tick machen.
Jason Sebring
14
Ich würde auch empfehlen, setUTCHoursanstelle von setHoursUniversal Time zu verwenden
Sidonaldson
2
Die Dinge mögen sich geändert haben, aber für mich setzt dies den Start auf UTC-Start für den vorherigen Tag und auf UTC-Ende für den vorherigen Tag.
David J
5
Bitte lesen Sie den äußerst wichtigen Kommentar von @ sidonaldson. Die Verwendung setHoursist gefährlich, da die lokalen Stunden anstelle der UTC-Stunden festgelegt werden.
Michael
229

Mit der Bibliothek momentjs kann dies mit den Methoden startOf()und endOf()für das aktuelle Datumsobjekt des Moments erreicht werden, wobei die Zeichenfolge 'day'als Argumente übergeben wird:

Lokale GMT:

var start = moment().startOf('day'); // set to 12:00 am today
var end = moment().endOf('day'); // set to 23:59 pm today

Für UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 
chridam
quelle
22
momentjs ist der One-Stop-Shop für alles, was mit JavaScript-Zeit zu tun hat. Immer den Import wert.
Daniel F
8
Und wir sollten .toDate()am Ende verwenden, um das Datum zu erhalten. var end = moment().endOf('day').toDate();
YaTaras
5
füge .unix()am Ende hinzu, um einen Unix-Zeitstempel in Sekunden zu erhalten :) wie moment().startOf('day').unix()
folgt
5
Moment js funktioniert irgendwie nicht, wenn ich ein vordefiniertes Date-Objekt habe, zB moment(new Date()).endOf("day");funktioniert nicht, aber moment().endOf("day");es funktioniert.
B. Kemmer
5
@KlasMellbourn Um den Start des Tages für eine bestimmte Zeitzone zu erhalten, können Sie Folgendes verwenden moment-timezoneund tun : moment().tz('America/Chicago').startOf('day').toDate().
Chad Johnson
8

Mit der Bibliothek luxon.js kann dasselbe mit den Methoden startOf und endOf erreicht werden, indem der Parameter 'day' übergeben wird

var DateTime = luxon.DateTime;
DateTime.local().startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z
DateTime.local().endOf('day').toUTC().toISO(); //2017-11-17T18:29:59.999Z
DateTime.fromISO(new Date().toISOString()).startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z

Entfernen Sie .toUTC (), wenn Sie nur die Ortszeit benötigen

und Sie können fragen, warum nicht moment.js , Antwort ist hier dafür.

tk120404
quelle
6

In MomentJs können wir es wie folgt deklarieren:

   const start = moment().format('YYYY-MM-DD 00:00:01');
   const end = moment().format('YYYY-MM-DD 23:59:59');
Ashutosh Jha
quelle
so viel hilfreicher!
Darlan Dieterich
6

Wenn Sie nur an Zeitstempeln in GMT interessiert sind , können Sie dies auch tun, die bequem für verschiedene Intervalle (Stunde : 1000 * 60 * 60, 12 Stunden: 1000 * 60 * 60 * 12usw.) angepasst werden können.

const interval = 1000 * 60 * 60 * 24; // 24 hours in milliseconds

let startOfDay = Math.floor(Date.now() / interval) * interval;
let endOfDay = startOfDay + interval - 1; // 23:59:59:9999
afinemonkey
quelle
1
Wichtige Einschränkung: Dies funktioniert nur, wenn Sie die Zeit in UTC wünschen. (Dies ist, was die Frage gestellt hat ... aber ich denke, ich sollte jeden warnen, der von einer Google-Suche hierher gekommen ist und dies nicht
Kip
4

Zu Ihrer Information (zusammengeführte Version von Tvanfosson)

Es wird das tatsächliche Datum => Datum zurückgegeben, an dem Sie die Funktion aufrufen

export const today = {
  iso: {
    start: () => new Date(new Date().setHours(0, 0, 0, 0)).toISOString(),
    now: () => new Date().toISOString(),
    end: () => new Date(new Date().setHours(23, 59, 59, 999)).toISOString()
  },
  local: {
  start: () => new Date(new Date(new Date().setHours(0, 0, 0, 0)).toString().split('GMT')[0] + ' UTC').toISOString(),
  now: () => new Date(new Date().toString().split('GMT')[0] + ' UTC').toISOString(),
  end: () => new Date(new Date(new Date().setHours(23, 59, 59, 999)).toString().split('GMT')[0] + ' UTC').toISOString()
  }
}

// wie benutzt man

today.local.now(); //"2018-09-07T01:48:48.000Z" BAKU +04:00
today.iso.now(); // "2018-09-06T21:49:00.304Z" * 

* Dies gilt für den Sofortzeittyp unter Java8, der Ihre Ortszeit abhängig von Ihrer Region automatisch konvertiert. (Wenn Sie planen, eine globale App zu schreiben.)

Musa
quelle
0

Ich bevorzuge die Datums-FNS- Bibliothek zur Datumsmanipulation . Es ist wirklich ein tolles modulares und konsistentes Werkzeug. Sie können den Tag auf folgende Weise beginnen und beenden:

var startOfDay = dateFns.startOfDay;
var endOfDay = dateFns.endOfDay;

console.log('start of day ==> ', startOfDay(new Date('2015-11-11')));
console.log('end of day ==> ', endOfDay(new Date('2015-11-11')));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>

Mikhail Shabrikov
quelle
Keine Unterstützung für die UTC-Behandlung.
Dobromir Hristov