Lernen wir ein neues integriertes Objekt kennen: Datum. Es speichert Datum und Uhrzeit und bietet Methoden für die Datums-/Uhrzeitverwaltung.
Wir können damit beispielsweise Erstellungs-/Änderungszeiten speichern, die Zeit messen oder einfach das aktuelle Datum ausdrucken.
Um ein neues Date
-Objekt zu erstellen, rufen Sie new Date()
mit einem der folgenden Argumente auf:
new Date()
Ohne Argumente – erstellen Sie ein Date
Objekt für das aktuelle Datum und die aktuelle Uhrzeit:
let now = new Date(); alarm(jetzt); // zeigt aktuelles Datum/Uhrzeit an
new Date(milliseconds)
Erstellen Sie ein Date
Objekt mit einer Zeit, die der Anzahl der Millisekunden (1/1000 Sekunde) entspricht, die nach dem 1. Januar 1970 UTC+0 vergangen sind.
// 0 bedeutet 01.01.1970 UTC+0 let Jan01_1970 = neues Datum(0); Warnung( Jan01_1970 ); // Jetzt 24 Stunden hinzufügen, erhalte 02.01.1970 UTC+0 let Jan02_1970 = new Date(24 * 3600 * 1000); Warnung( Jan02_1970 );
Eine ganze Zahl, die die Anzahl der Millisekunden angibt, die seit Anfang 1970 vergangen sind, wird als Zeitstempel bezeichnet.
Es handelt sich um eine einfache numerische Darstellung eines Datums. Wir können jederzeit ein Datum aus einem Zeitstempel mit new Date(timestamp)
erstellen und das vorhandene Date
Objekt mit der Methode date.getTime()
in einen Zeitstempel konvertieren (siehe unten).
Daten vor dem 01.01.1970 haben negative Zeitstempel, z. B.:
// 31. Dezember 1969 let Dec31_1969 = neues Datum(-24 * 3600 * 1000); Warnung( 31. Dezember 1969 );
new Date(datestring)
Wenn es ein einzelnes Argument gibt und es sich um eine Zeichenfolge handelt, wird es automatisch analysiert. Der Algorithmus ist derselbe, Date.parse
verwendet, wir werden ihn später behandeln.
let date = new Date("26.01.2017"); Warnung(Datum); // Die Zeit ist nicht festgelegt, daher wird davon ausgegangen, dass es Mitternacht GMT ist und // wird entsprechend der Zeitzone angepasst, in der der Code ausgeführt wird // So könnte das Ergebnis sein // Do, 26. Januar 2017, 11:00:00 GMT+1100 (Australian Eastern Daylight Time) // oder // Mi, 25. Januar 2017, 16:00:00 GMT-0800 (Pacific Standard Time)
new Date(year, month, date, hours, minutes, seconds, ms)
Erstellen Sie das Datum mit den angegebenen Komponenten in der lokalen Zeitzone. Nur die ersten beiden Argumente sind obligatorisch.
Das year
sollte 4-stellig sein. Aus Kompatibilitätsgründen werden auch 2 Ziffern akzeptiert und als 19xx
betrachtet, z. B. 98
ist hier dasselbe wie 1998
, es wird jedoch dringend empfohlen, immer 4 Ziffern zu verwenden.
Die month
beginnt bei 0
(Jan) und geht bis 11
(Dez).
Der date
ist eigentlich der Tag des Monats. Wenn er nicht vorhanden ist, wird 1
angenommen.
Wenn hours/minutes/seconds/ms
fehlen, wird davon ausgegangen, dass sie gleich 0
sind.
Zum Beispiel:
neues Datum (2011, 0, 1, 0, 0, 0, 0); // 1. Jan. 2011, 00:00:00 neues Datum (2011, 0, 1); // das Gleiche, Stunden usw. sind standardmäßig 0
Die maximale Genauigkeit beträgt 1 ms (1/1000 Sek):
let date = new Date(2011, 0, 1, 2, 3, 4, 567); Warnung( Datum); // 1.01.2011, 02:03:04.567
Es gibt Methoden, um über das Date
-Objekt auf Jahr, Monat usw. zuzugreifen:
getFullYear()
Holen Sie sich das Jahr (4 Ziffern)
getMonth()
Holen Sie sich den Monat von 0 bis 11 .
getDate()
Holen Sie sich den Tag des Monats von 1 bis 31, der Name der Methode sieht etwas seltsam aus.
getHours(), getMinutes(), getSeconds(), getMilliseconds()
Holen Sie sich die entsprechenden Zeitkomponenten.
Nicht getYear()
, sondern getFullYear()
Viele JavaScript-Engines implementieren eine nicht standardmäßige Methode getYear()
. Diese Methode ist veraltet. Manchmal wird eine zweistellige Jahresangabe zurückgegeben. Bitte verwenden Sie es niemals. Für das Jahr gibt es getFullYear()
.
Zusätzlich können wir einen Wochentag erhalten:
getDay()
Holen Sie sich den Wochentag von 0
(Sonntag) bis 6
(Samstag). Der erste Tag ist immer Sonntag, in manchen Ländern ist das nicht so, kann aber nicht geändert werden.
Alle oben genannten Methoden geben die Komponenten relativ zur lokalen Zeitzone zurück.
Es gibt auch ihre UTC-Gegenstücke, die Tag, Monat, Jahr usw. für die Zeitzone UTC+0 zurückgeben: getUTCFullYear(), getUTCMonth(), getUTCDay(). Fügen Sie einfach "UTC"
direkt nach "get"
ein.
Wenn Ihre lokale Zeitzone relativ zur UTC verschoben ist, zeigt der folgende Code andere Stunden an:
// aktuelles Datum let date = new Date(); // die Stunde in Ihrer aktuellen Zeitzone alarm( date.getHours() ); // die Stunde in der Zeitzone UTC+0 (Londoner Zeit ohne Sommerzeit) alarm( date.getUTCHours() );
Neben den angegebenen Methoden gibt es zwei spezielle Methoden, die keine UTC-Variante haben:
getTime()
Gibt den Zeitstempel für das Datum zurück – eine Anzahl von Millisekunden, die seit dem 1. Januar 1970 UTC+0 vergangen sind.
getTimezoneOffset()
Gibt die Differenz zwischen UTC und der lokalen Zeitzone in Minuten zurück:
// Wenn Sie sich in der Zeitzone UTC-1 befinden, wird 60 ausgegeben // Wenn Sie sich in der Zeitzone UTC+3 befinden, wird -180 ausgegeben alarm( new Date().getTimezoneOffset() );
Mit den folgenden Methoden können Datums-/Uhrzeitkomponenten festgelegt werden:
setFullYear(year, [month], [date])
setMonth(month, [date])
setDate(date)
setHours(hour, [min], [sec], [ms])
setMinutes(min, [sec], [ms])
setSeconds(sec, [ms])
setMilliseconds(ms)
setTime(milliseconds)
(setzt das gesamte Datum in Millisekunden seit dem 01.01.1970 UTC)
Jeder von ihnen außer setTime()
hat eine UTC-Variante, zum Beispiel: setUTCHours()
.
Wie wir sehen können, können einige Methoden mehrere Komponenten gleichzeitig festlegen, zum Beispiel setHours
. Die nicht genannten Komponenten werden nicht verändert.
Zum Beispiel:
let today = new Date(); today.setHours(0); alarm(heute); // immer noch heute, aber die Stunde wird auf 0 geändert today.setHours(0, 0, 0, 0); alarm(heute); // noch heute, jetzt Punkt 00:00:00.
Die Autokorrektur ist eine sehr praktische Funktion von Date
-Objekten. Wir können Werte festlegen, die außerhalb des Bereichs liegen, und es passt sich automatisch an.
Zum Beispiel:
let date = new Date(2013, 0, 32); // 32. Jan. 2013 ?!? Warnung(Datum); // ...ist der 1. Februar 2013!
Datumskomponenten außerhalb des gültigen Bereichs werden automatisch verteilt.
Nehmen wir an, wir müssen das Datum „28. Februar 2016“ um 2 Tage verlängern. Im Falle eines Schaltjahres kann es „2. März“ oder „1. März“ sein. Wir müssen nicht darüber nachdenken. Fügen Sie einfach 2 Tage hinzu. Den Rest erledigt das Date
Objekt:
let date = new Date(2016, 1, 28); date.setDate(date.getDate() + 2); Warnung( Datum); // 1. März 2016
Diese Funktion wird häufig verwendet, um das Datum nach einem bestimmten Zeitraum abzurufen. Lassen Sie uns zum Beispiel das Datum für „70 Sekunden nach jetzt“ ermitteln:
let date = new Date(); date.setSeconds(date.getSeconds() + 70); Warnung( Datum); // zeigt das korrekte Datum an
Wir können auch Null- oder sogar negative Werte festlegen. Zum Beispiel:
let date = new Date(2016, 0, 2); // 2. Januar 2016 date.setDate(1); // Tag 1 des Monats festlegen Warnung( Datum); date.setDate(0); // min day ist 1, daher wird der letzte Tag des Vormonats angenommen Warnung( Datum); // 31. Dezember 2015
Wenn ein Date
Objekt in eine Zahl konvertiert wird, wird es zum gleichen Zeitstempel wie date.getTime()
:
let date = new Date(); Warnung(+Datum); // die Anzahl der Millisekunden, dasselbe wie date.getTime()
Der wichtige Nebeneffekt: Datumsangaben können subtrahiert werden, das Ergebnis ist deren Differenz in ms.
Das kann für Zeitmessungen verwendet werden:
let start = new Date(); // Beginnen Sie mit der Zeitmessung // mach den Job for (sei i = 0; i < 100000; i++) { let doSomething = i * i * i; } let end = new Date(); // Messzeit beenden Alert( `Die Schleife hat ${end - start} ms gedauert` );
Wenn wir nur die Zeit messen möchten, benötigen wir das Date
Objekt nicht.
Es gibt eine spezielle Methode Date.now()
, die den aktuellen Zeitstempel zurückgibt.
Es ist semantisch äquivalent zu new Date().getTime()
, erstellt jedoch kein dazwischenliegendes Date
Objekt. Es ist also schneller und übt keinen Druck auf die Speicherbereinigung aus.
Es wird hauptsächlich aus Bequemlichkeitsgründen oder dann verwendet, wenn es auf die Leistung ankommt, etwa bei Spielen in JavaScript oder anderen Spezialanwendungen.
Das ist also wahrscheinlich besser:
let start = Date.now(); // Millisekunden zählen ab dem 1. Januar 1970 // mach den Job for (sei i = 0; i < 100000; i++) { let doSomething = i * i * i; } let end = Date.now(); // Erledigt Alert( `Die Schleife hat ${end - start} ms gedauert` ); // Zahlen subtrahieren, keine Daten
Wenn wir einen zuverlässigen Benchmark für CPU-hungrige Funktionen wünschen, sollten wir vorsichtig sein.
Lassen Sie uns zum Beispiel zwei Funktionen messen, die die Differenz zwischen zwei Datumsangaben berechnen: Welche ist schneller?
Solche Leistungsmessungen werden oft als „Benchmarks“ bezeichnet.
// Wir haben Datum1 und Datum2. Welche Funktion gibt ihre Differenz in ms schneller zurück? Funktion diffSubtract(date1, date2) { Rückgabedatum2 - Datum1; } // oder Funktion diffGetTime(date1, date2) { return date2.getTime() - date1.getTime(); }
Diese beiden machen genau das Gleiche, aber einer von ihnen verwendet explizit date.getTime()
, um das Datum in ms zu erhalten, und der andere verlässt sich auf eine Datum-in-Zahl-Transformation. Ihr Ergebnis ist immer das gleiche.
Also, welches ist schneller?
Die erste Idee könnte sein, sie mehrmals hintereinander laufen zu lassen und den Zeitunterschied zu messen. In unserem Fall sind die Funktionen sehr einfach, daher müssen wir sie mindestens 100.000 Mal ausführen.
Lass uns messen:
Funktion diffSubtract(date1, date2) { Rückgabedatum2 - Datum1; } Funktion diffGetTime(date1, date2) { return date2.getTime() - date1.getTime(); } Funktion bench(f) { let date1 = neues Datum(0); let date2 = new Date(); let start = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); return Date.now() - start; } alarm( 'Zeit von diffSubtract: ' + bench(diffSubtract) + 'ms' ); Alert( 'Zeit von diffGetTime: ' + bench(diffGetTime) + 'ms' );
Wow! Die Verwendung von getTime()
ist viel schneller! Da es keine Typkonvertierung gibt, ist die Optimierung für Engines viel einfacher.
Okay, wir haben etwas. Aber das ist noch kein guter Maßstab.
Stellen Sie sich vor, dass die CPU zum Zeitpunkt der Ausführung von bench(diffSubtract)
etwas parallel ausführte und Ressourcen beanspruchte. Und wenn bench(diffGetTime)
ausgeführt wird, ist diese Arbeit abgeschlossen.
Ein ziemlich reales Szenario für ein modernes Multiprozess-Betriebssystem.
Dadurch verfügt der erste Benchmark über weniger CPU-Ressourcen als der zweite. Das kann zu falschen Ergebnissen führen.
Für ein zuverlässigeres Benchmarking sollte das gesamte Benchmarkpaket mehrmals wiederholt werden.
Zum Beispiel so:
Funktion diffSubtract(date1, date2) { Rückgabedatum2 - Datum1; } Funktion diffGetTime(date1, date2) { return date2.getTime() - date1.getTime(); } Funktion bench(f) { let date1 = neues Datum(0); let date2 = new Date(); let start = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); return Date.now() - start; } sei time1 = 0; sei time2 = 0; // bench(diffSubtract) und bench(diffGetTime) jeweils 10 Mal abwechselnd ausführen for (sei i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); } alarm( 'Gesamtzeit für diffSubtract: ' + time1 ); alarm( 'Gesamtzeit für diffGetTime: ' + time2 );
Moderne JavaScript-Engines beginnen mit der Anwendung erweiterter Optimierungen nur auf „Hot Code“, der viele Male ausgeführt wird (selten ausgeführte Dinge müssen nicht optimiert werden). Im obigen Beispiel sind die ersten Ausführungen also nicht gut optimiert. Möglicherweise möchten wir einen Aufheizlauf hinzufügen:
// zum „Aufheizen“ vor der Hauptschleife hinzugefügt bench(diffSubtract); bench(diffGetTime); // jetzt Benchmark for (sei i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); }
Seien Sie beim Mikrobenchmarking vorsichtig
Moderne JavaScript-Engines führen viele Optimierungen durch. Sie können die Ergebnisse „künstlicher Tests“ im Vergleich zur „normalen Nutzung“ optimieren, insbesondere wenn wir etwas sehr Kleines vergleichen, beispielsweise die Funktionsweise eines Operators oder eine integrierte Funktion. Wenn Sie also ernsthaft etwas über die Leistung verstehen möchten, dann studieren Sie bitte die Funktionsweise der JavaScript-Engine. Und dann benötigen Sie wahrscheinlich überhaupt keine Mikrobenchmarks.
Das große Paket an Artikeln über V8 finden Sie unter https://mrale.ph.
Die Methode Date.parse(str) kann ein Datum aus einem String lesen.
Das Zeichenfolgenformat sollte sein: YYYY-MM-DDTHH:mm:ss.sssZ
, wobei:
YYYY-MM-DD
– ist das Datum: Jahr-Monat-Tag.
Als Trennzeichen wird das Zeichen "T"
verwendet.
HH:mm:ss.sss
– ist die Zeit: Stunden, Minuten, Sekunden und Millisekunden.
Der optionale Teil 'Z'
gibt die Zeitzone im Format +-hh:mm
an. Ein einzelner Buchstabe Z
würde UTC+0 bedeuten.
Es sind auch kürzere Varianten möglich, etwa YYYY-MM-DD
oder YYYY-MM
oder sogar YYYY
.
Der Aufruf von Date.parse(str)
analysiert die Zeichenfolge im angegebenen Format und gibt den Zeitstempel zurück (Anzahl der Millisekunden seit dem 1. Januar 1970 UTC+0). Wenn das Format ungültig ist, wird NaN
zurückgegeben.
Zum Beispiel:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00'); Warnung(ms); // 1327611110417 (Zeitstempel)
Aus dem Zeitstempel können wir sofort ein new Date
Objekt erstellen:
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') ); Warnung(Datum);
Datum und Uhrzeit werden in JavaScript mit dem Date-Objekt dargestellt. Wir können nicht „nur Datum“ oder „nur Uhrzeit“ erstellen: Date
tragen immer beides.
Monate werden von Null an gezählt (ja, der Januar ist ein Nullmonat).
Wochentage in getDay()
werden ebenfalls von Null an gezählt (das ist Sonntag).
Date
korrigiert sich automatisch, wenn Komponenten außerhalb des zulässigen Bereichs eingestellt werden. Gut zum Addieren/Subtrahieren von Tagen/Monaten/Stunden.
Datumsangaben können subtrahiert werden, wodurch die Differenz in Millisekunden angegeben wird. Das liegt daran, dass ein Date
zum Zeitstempel wird, wenn es in eine Zahl umgewandelt wird.
Verwenden Sie Date.now()
um schnell den aktuellen Zeitstempel abzurufen.
Beachten Sie, dass Zeitstempel in JavaScript im Gegensatz zu vielen anderen Systemen in Millisekunden und nicht in Sekunden angegeben werden.
Manchmal benötigen wir genauere Zeitmessungen. JavaScript selbst bietet keine Möglichkeit, die Zeit in Mikrosekunden (1 Millionstel Sekunde) zu messen, die meisten Umgebungen bieten diese jedoch an. Der Browser verfügt beispielsweise über performance.now(), das die Anzahl der Millisekunden ab Beginn des Seitenladens mit Mikrosekundengenauigkeit angibt (drei Ziffern nach dem Punkt):
Alert(`Der Ladevorgang hat vor ${performance.now()}ms begonnen`); // Etwas wie: „Der Ladevorgang begann vor 34731,26000000001 ms.“ // .26 ist Mikrosekunden (260 Mikrosekunden) // mehr als 3 Nachkommastellen sind Präzisionsfehler, nur die ersten 3 sind korrekt
Node.js verfügt über ein microtime
und andere Möglichkeiten. Technisch gesehen ermöglicht fast jedes Gerät und jede Umgebung eine höhere Präzision, nur nicht in Date
.
Wichtigkeit: 5
Erstellen Sie ein Date
Objekt für das Datum: 20. Februar 2012, 3:12 Uhr. Die Zeitzone ist lokal.
Zeigen Sie es mit alert
an.
Der new Date
-Konstruktor verwendet die lokale Zeitzone. Das einzig Wichtige, das Sie beachten sollten, ist, dass die Monate bei Null beginnen.
Der Februar hat also die Nummer 1.
Hier ist ein Beispiel mit Zahlen als Datumskomponenten:
//neues Datum(Jahr, Monat, Datum, Stunde, Minute, Sekunde, Millisekunde) sei d1 = neues Datum(2012, 1, 20, 3, 12); alarm( d1 );
Wir könnten auch ein Datum aus einer Zeichenfolge erstellen, etwa so:
//neues Datum(Datenzeichenfolge) let d2 = new Date("2012-02-20T03:12"); alarm( d2 );
Wichtigkeit: 5
Schreiben Sie eine Funktion getWeekDay(date)
um den Wochentag im Kurzformat anzuzeigen: „MO“, „TU“, „WE“, „TH“, „FR“, „SA“, „SU“.
Zum Beispiel:
let date = new Date(2012, 0, 3); // 3. Januar 2012 alarm( getWeekDay(date) ); // sollte „TU“ ausgeben
Öffnen Sie eine Sandbox mit Tests.
Die Methode date.getDay()
gibt die Nummer des Wochentags, beginnend mit Sonntag, zurück.
Lassen Sie uns eine Reihe von Wochentagen erstellen, damit wir anhand der Nummer den richtigen Tagesnamen erhalten:
Funktion getWeekDay(date) { let days = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA']; return days[date.getDay()]; } let date = new Date(2014, 0, 3); // 3. Januar 2014 alarm( getWeekDay(date) ); // FR
Öffnen Sie die Lösung mit Tests in einer Sandbox.
Wichtigkeit: 5
In europäischen Ländern gibt es Wochentage beginnend mit Montag (Nummer 1), dann Dienstag (Nummer 2) und bis Sonntag (Nummer 7). Schreiben Sie eine Funktion getLocalDay(date)
, die den „europäischen“ Wochentag für date
zurückgibt.
let date = new Date(2012, 0, 3); // 3. Januar 2012 alarm( getLocalDay(date) ); // Dienstag, sollte 2 anzeigen
Öffnen Sie eine Sandbox mit Tests.
Funktion getLocalDay(date) { let day = date.getDay(); if (day == 0) { // Wochentag 0 (Sonntag) ist 7 in Europa Tag = 7; } Rückgabetag; }
Öffnen Sie die Lösung mit Tests in einer Sandbox.
Wichtigkeit: 4
Erstellen Sie eine Funktion getDateAgo(date, days)
um den Tag des Monats vor days
seit dem date
zurückzugeben.
Wenn heute beispielsweise der 20. ist, sollte getDateAgo(new Date(), 1)
der 19. und getDateAgo(new Date(), 2)
der 18. sein.
Sollte für days=365
oder länger zuverlässig funktionieren:
let date = new Date(2015, 0, 2); alarm( getDateAgo(date, 1) ); // 1, (1. Jan. 2015) alarm( getDateAgo(date, 2) ); // 31. (31. Dez. 2014) alarm( getDateAgo(date, 365) ); // 2, (2. Jan. 2014)
PS: Die Funktion sollte das angegebene date
nicht ändern.
Öffnen Sie eine Sandbox mit Tests.
Die Idee ist einfach: Eine bestimmte Anzahl von Tagen vom date
abziehen:
Funktion getDateAgo(Datum, Tage) { date.setDate(date.getDate() - Tage); Rückgabedatum.getDate(); }
…Aber die Funktion sollte date
nicht ändern. Das ist wichtig, denn der äußere Code, der uns das Datum liefert, erwartet keine Änderung.
Um es zu implementieren, klonen wir das Datum wie folgt:
Funktion getDateAgo(Datum, Tage) { let dateCopy = new Date(date); dateCopy.setDate(date.getDate() - Tage); return dateCopy.getDate(); } let date = new Date(2015, 0, 2); alarm( getDateAgo(date, 1) ); // 1, (1. Jan. 2015) alarm( getDateAgo(date, 2) ); // 31. (31. Dez. 2014) alarm( getDateAgo(date, 365) ); // 2, (2. Jan. 2014)
Öffnen Sie die Lösung mit Tests in einer Sandbox.
Wichtigkeit: 5
Schreiben Sie eine Funktion getLastDayOfMonth(year, month)
die den letzten Tag des Monats zurückgibt. Manchmal ist es der 30., 31. oder sogar der 28./29. Februar.
Parameter:
year
– vierstelliges Jahr, zum Beispiel 2012.
month
– Monat, von 0 bis 11.
Zum Beispiel getLastDayOfMonth(2012, 1) = 29
(Schaltjahr, Februar).
Öffnen Sie eine Sandbox mit Tests.
Erstellen wir ein Datum mit dem nächsten Monat, übergeben aber Null als Tag:
Funktion getLastDayOfMonth(Jahr, Monat) { let date = neues Datum(Jahr, Monat + 1, 0); Rückgabedatum.getDate(); } alarm( getLastDayOfMonth(2012, 0) ); // 31 alarm( getLastDayOfMonth(2012, 1) ); // 29 alarm( getLastDayOfMonth(2013, 1) ); // 28
Normalerweise beginnen Datumsangaben bei 1, aber technisch gesehen können wir jede Zahl übergeben, das Datum passt sich automatisch an. Wenn wir also 0 übergeben, bedeutet dies „einen Tag vor dem 1. Tag des Monats“, mit anderen Worten: „der letzte Tag des vorherigen Monats“.
Öffnen Sie die Lösung mit Tests in einer Sandbox.
Wichtigkeit: 5
Schreiben Sie eine Funktion getSecondsToday()
, die die Anzahl der Sekunden seit Beginn des heutigen Tages zurückgibt.
Wenn es jetzt beispielsweise 10:00 am
wäre und es keine Sommerzeitumstellung gäbe, dann:
getSecondsToday() == 36000 // (3600 * 10)
Die Funktion sollte jeden Tag funktionieren. Das heißt, es sollte nicht den fest codierten Wert „heute“ haben.
Um die Anzahl der Sekunden zu erhalten, können wir ein Datum anhand des aktuellen Tages und der aktuellen Uhrzeit 00:00:00 generieren und es dann von „jetzt“ subtrahieren.
Die Differenz ist die Anzahl der Millisekunden vom Beginn des Tages an, die wir durch 1000 dividieren müssen, um Sekunden zu erhalten:
Funktion getSecondsToday() { let now = new Date(); // ein Objekt mit dem aktuellen Tag/Monat/Jahr erstellen let today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); let diff = now - today; // ms Unterschied return Math.round(diff / 1000); // Sekunden machen } alarm( getSecondsToday() );
Eine alternative Lösung wäre, Stunden/Minuten/Sekunden zu ermitteln und in Sekunden umzuwandeln:
Funktion getSecondsToday() { sei d = new Date(); return d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds(); } alarm( getSecondsToday() );
Wichtigkeit: 5
Erstellen Sie eine Funktion getSecondsToTomorrow()
, die die Anzahl der Sekunden bis morgen zurückgibt.
Wenn jetzt zum Beispiel 23:00
ist, dann:
getSecondsToTomorrow() == 3600
PS: Die Funktion sollte an jedem Tag funktionieren, das „heute“ ist nicht fest codiert.
Um die Anzahl der Millisekunden bis morgen zu erhalten, können wir von „morgen 00:00:00“ das aktuelle Datum subtrahieren.
Zuerst generieren wir das „morgen“ und machen es dann:
Funktion getSecondsToTomorrow() { let now = new Date(); // morgen Datum let morgen = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1); let diff = morgen - jetzt; // Unterschied in ms return Math.round(diff / 1000); // in Sekunden umwandeln }
Alternative Lösung:
Funktion getSecondsToTomorrow() { let now = new Date(); let Hour = now.getHours(); let minuten = now.getMinutes(); let seconds = now.getSeconds(); let totalSecondsToday = (Stunde * 60 + Minuten) * 60 + Sekunden; let totalSecondsInADay = 86400; return totalSecondsInADay - totalSecondsToday; }
Bitte beachten Sie, dass in vielen Ländern Sommerzeit (DST) gilt und es daher Tage mit 23 oder 25 Stunden geben kann. Vielleicht möchten wir solche Tage gesondert behandeln.
Wichtigkeit: 4
Schreiben Sie eine Funktion formatDate(date)
, die date
wie folgt formatieren soll:
Wenn seit date
weniger als 1 Sekunde vergangen ist, dann "right now"
.
Andernfalls, wenn seit date
weniger als 1 Minute vergangen ist, dann "n sec. ago"
.
Andernfalls, wenn weniger als eine Stunde, dann "m min. ago"
.
Ansonsten das vollständige Datum im Format "DD.MM.YY HH:mm"
. Das heißt: "day.month.year hours:minutes"
, alles im 2-stelligen Format, z. B. 31.12.16 10:00
.
Zum Beispiel:
alarm( formatDate(new Date(new Date - 1)) ); // "im Augenblick" warning( formatDate(new Date(new Date - 30 * 1000)) ); // „vor 30 Sek.“ warning( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // „vor 5 Min.“ // Gestriges Datum wie 31.12.16 20:00 warning( formatDate(new Date(new Date - 86400 * 1000)) );
Öffnen Sie eine Sandbox mit Tests.
Um die Zeit vom date
bis jetzt zu erhalten, subtrahieren wir die Daten.
Funktion formatDate(date) { let diff = new Date() - date; // die Differenz in Millisekunden if (diff < 1000) { // weniger als 1 Sekunde Rückkehr „sofort“; } let sec = Math.floor(diff / 1000); // Diff in Sekunden umwandeln if (sec < 60) { return sec + ' sec. vor'; } let min = Math.floor(diff / 60000); // Diff in Minuten umwandeln if (min < 60) { Rückkehr min + ' min. vor'; } // formatiere das Datum // führende Nullen zu einstelligen Zahlen für Tag/Monat/Stunden/Minuten hinzufügen sei d = Datum; d = [ '0' + d.getDate(), '0' + (d.getMonth() + 1), '' + d.getFullYear(), '0' + d.getHours(), '0' + d.getMinutes() ].map(component => Component.slice(-2)); // Nimm die letzten 2 Ziffern jeder Komponente // die Komponenten zu date zusammenfügen return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':'); } alarm( formatDate(new Date(new Date - 1)) ); // "im Augenblick" warning( formatDate(new Date(new Date - 30 * 1000)) ); // „vor 30 Sek.“ warning( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // „vor 5 Min.“ // Gestriges Datum wie 31.12.2016 20:00 warning( formatDate(new Date(new Date - 86400 * 1000)) );
Alternative Lösung:
Funktion formatDate(date) { let dayOfMonth = date.getDate(); let Monat = date.getMonth() + 1; let year = date.getFullYear(); let Hour = date.getHours(); letminutes = date.getMinutes(); let diffMs = new Date() - date; let diffSec = Math.round(diffMs / 1000); sei diffMin = diffSec / 60; sei diffHour = diffMin / 60; // Formatierung Jahr = Jahr.toString().slice(-2); Monat = Monat < 10 ? '0' + Monat: Monat; dayOfMonth = dayOfMonth < 10 ? '0' + dayOfMonth : dayOfMonth; Stunde = Stunde < 10 ? '0' + Stunde : Stunde; Minuten = Minuten < 10 ? '0' + Minuten : Minuten; if (diffSec < 1) { Rückkehr „sofort“; } else if (diffMin < 1) { return `${diffSec} sec. vor` } else if (diffHour < 1) { return `${diffMin} min. vor` } anders { Rückgabe „${dayOfMonth}.${month}.${year} ${hour}:${minutes}“. } }
Öffnen Sie die Lösung mit Tests in einer Sandbox.