Javascript zu einer bestimmten Zeit. TempusJS - Arbeiten mit Datum in Javascript. Automatische Erkennung und Analyse von Datumsangaben


In JavaScript gibt es ein spezielles Objekt für die Arbeit mit Datum und Uhrzeit - Datum. Dieses Objekt wird von fast allen JavaScript-Versionen unterstützt, und Sie können es verwenden, ohne auf Kompatibilitätsprobleme zurückblicken zu müssen.

Datum und Uhrzeit im Date-Objekt werden nicht explizit gespeichert, sondern wie in den meisten Programmiersprachen - in Form der Anzahl der Millisekunden seit der Geburt von Unix, d. H. von 0 Stunden 0 Minuten 1. Januar 1970. Eine Besonderheit des Date-Objekts besteht darin, dass alle Bereichswerte auf Null basierende Indizes haben. Dies bedeutet, dass der Januar einen Index von 0 (Monat 0) hat und der Dezember nicht der zwölfte, sondern der elfte Monat ist. Gleiches gilt für die Wochentage, Stunden, Minuten usw.

Es ist sehr einfach, ein Datumsobjekt zu erstellen:

// aktuelles Datum / Uhrzeit var date \u003d new Date (); // Datum-Uhrzeit von Zeichenfolge oder Zahl var Datum \u003d neues Datum (Datum); // Datum / Uhrzeit von separaten Werten var date \u003d new Datum (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Millisekunde);

Das Date-Objekt verfügt über eine Reihe sehr nützlicher Methoden, mit denen Sie mit einzelnen Datums- / Uhrzeitkomponenten arbeiten sowie die Richtigkeit überprüfen und das richtige Datum in einem bestimmten Format anzeigen können.

Methoden zum Abrufen von Datums- und Uhrzeitkomponenten
getFullYear Gibt das Jahr zurück (z. B. 2011).
getYear Gibt das Jahr zurück. Der Zweck der getYear-Methode ähnelt dem Zweck von getFullYear, diese Methode ist jedoch veraltet und veraltet. Die Ergebnisse seiner Arbeit sind nicht eindeutig: Für den Datumsbereich von 1900 bis 1999 gibt die Methode die Jahreszahl im Jahrhundert zurück (zweistellig, z. B. 77), und für Daten außerhalb dieses Bereichs wird der vollständige Wert (vierstellig, z. B. 2009) zurückgegeben.
getMonth Gibt den Monat zurück.
verabredung bekommen Gibt den Tag des Monats zurück (Nummer im Monat).
getHours Gibt die Stunde zurück.
getMinutes Gibt die Minute zurück.
getSeconds Gibt den zweiten zurück.
getMilliseconds Gibt die Millisekunde zurück.
getDay Gibt den Wochentag zurück.
zeit bekommen Gibt den vom Objekt gespeicherten Millisekundenversatz zurück.
Methoden zum Ändern von datetime-Komponenten
setFullYear Legt das Jahr fest.
setYear Legt das Jahr fest. Der Zweck der setYear-Methode ist der gleiche wie der Zweck von setFullYear, aber diese Methode ist veraltet und veraltet (wie die getYear-Methode).
setMonth Legt den Monat fest.
datum einstellen Legt das Datum im Monat (Tag des Monats) fest.
setHours Legt die Stunde fest.
setMinutes Legt die Minute fest.
setSeconds Legt den zweiten fest.
setMilliseconds Legt die Millisekunde fest.
zeit einstellen Legt den Millisekundenversatz von 00:00:00 01/01/1970 fest
Formatierungs- und Ausgabefunktionen für Datum und Uhrzeit
toString Gibt eine Zeichenfolgendarstellung von Datum und Uhrzeit zurück.
toUTCString Gibt eine Zeichenfolgendarstellung des Datums und der Uhrzeit zurück, die in UTC-Zeit konvertiert wurden. Das Format der zurückgegebenen Zeichenfolge basiert auf allen Internetstandards.
toGMTString Gibt eine Zeichenfolgendarstellung des Datums und der Uhrzeit zurück, die in GMT (Greenwich Mean Time) konvertiert wurden. Das zurückgegebene Zeichenfolgenformat entspricht allen Internetstandards.
toLocaleString Ähnlich wie bei String, gibt jedoch eine Zeichenfolgendarstellung des Datums und der Uhrzeit zurück, die gemäß den Lokalisierungseinstellungen des Benutzers formatiert wurden.
toTimeString Gibt eine Zeichenfolgendarstellung der Zeit zurück (die Zeichenfolge enthält nur die Zeit).
toDateString Gibt die Zeichenfolgendarstellung des Datums zurück (die Zeichenfolge enthält nur das Datum).
toLocaleTimeString Ähnlich wie bei TimeString, gibt jedoch eine Zeichenfolgendarstellung der Zeit zurück, die gemäß den Lokalisierungseinstellungen des Benutzers formatiert wurde.
toLocaleDateString Ähnlich wie toDateString, gibt jedoch eine Zeichenfolgendarstellung des Datums zurück, die gemäß den Lokalisierungseinstellungen des Benutzers formatiert ist.
Zusätzliche Funktionen
getTimezoneOffset Gibt den Versatz der Ortszeit auf dem Computer des Benutzers relativ zu UTC zurück. Der Offset wird in Minuten zurückgegeben.
analysieren Mit dieser Funktion können Sie die Richtigkeit der als Zeichenfolge geschriebenen Uhrzeit überprüfen. Wenn die Zeichenfolge korrekt ist, wird sofort ein Datumsobjekt erstellt.

Das Date-Objekt enthält auch eine Reihe von Methoden zum Arbeiten mit UTC-Datumsangaben. Diese Funktionen sind den bereits berücksichtigten Funktionen völlig ähnlich, enthalten jedoch das Präfix "UTC" im Namen und funktionieren nur mit der "universellen" Zeit: getUTCSeconds, setUTCFullYear usw.

Betrachten wir ein Beispiel für die Arbeit mit Datumsangaben:

Und hier ist das Ergebnis dieses Skripts:


Wie Sie sehen können, unterscheidet sich die Darstellung des Datums je nach verwendetem Format erheblich. Wenn Sie mit Datum und Uhrzeit arbeiten, müssen Sie daher einige einfache Regeln einhalten:

1. Verwenden Sie nach Möglichkeit UTC- oder GMT-Formate. Dies ist besonders wichtig, wenn verteilte Lösungen erstellt werden (z. B. Kunden von Zahlungssystemen). Wenn Sie eine gemeinsame Referenzzeit verwenden, erhalten Sie Garantien (wenn auch nicht hundertprozentig), dass Sie und Ihr Remote-Partner die empfangenen Daten auf dieselbe Weise interpretieren.

2. Es ist sinnvoll, lokalisiertes Datum und Uhrzeit nur zu verwenden, wenn sie dem Benutzer angezeigt werden. In allen anderen Fällen ist es besser, lokalisierte Daten abzulehnen.

3. Wenn Sie immer noch ein lokales Datum und eine lokale Uhrzeit verwenden müssen, vergessen Sie nicht, den Versatz der lokalen Uhrzeit relativ zur Referenzzeit (UTC oder GMT) zu berücksichtigen.

Das Befolgen dieser Regeln erspart Ihnen die meisten logischen Fehler und Mängel, was bedeutet, dass Ihr Code stabiler und von hoher Qualität ist.

Es ist selten, dass ein Programmierer es vermeidet, mit Datum und Uhrzeit zu arbeiten. Im Allgemeinen ist Datum / Uhrzeit ein Grundkonzept, und in den meisten Sprachen sind Mechanismen für die Arbeit mit diesem Datentyp integriert. Es scheint, dass JS keine Ausnahme ist, es gibt einen eingebauten Datumstyp, es gibt viele Funktionen im Prototyp, jedoch ...

Wer ist schuldig?
Das erste Problem tritt auf, wenn Sie Datum und Uhrzeit in einer anderen Zeitzone als UTC und lokal einstellen müssen. Der Date-Konstruktor hat keinen solchen Parameter.

Neues Datum (); neues Datum (Wert); neues Datum (dateString); neues Datum (Jahr, Monat [, Tag [, Stunde [, Minute [, Sekunde [, Millisekunde]]]);
Die einzige Option, bei der Sie einen Versatz relativ zu UTC angeben können, ist der dritte Weg. Wenn Sie den Konstruktor in diesem Format aufrufen, können Sie den Offset als Teil der Zeichenfolge übergeben:

Neues Datum ("So 01.02.1998 00:00:00 GMT + 0700")
Die Zeichenfolge wird im RFC2822-Format akzeptiert, was für die manuelle Eingabe sehr unpraktisch und schwierig ist. Es ist fast unmöglich, eine solche Zeichenfolge aus Benutzereingaben zu erhalten. Ich kann mir keine Person vorstellen, die zustimmen würde, ein Datum in diesem Format einzugeben.

Trotz der Tatsache, dass Sie in Datum alle Parameter für die UTC-Zeitzone separat einstellen können - dies löst das Problem nicht -, bleibt die Zeitzone lokal. Dies ist jedoch nicht das einzige Problem.

Der UTC-Offset ist nicht konstant. Dies ist eine Funktion von Datum, Uhrzeit (oder von einem Zeitstempel, wenn Sie möchten) und wiederum einer Zeitzone. Für Moskau ergibt die letzte Übersetzung beispielsweise:

Neues Datum (2014, 9, 25, 0, 0, 0); // 26.10.2014, 21:00:00 GMT + 3 neues Datum (2014, 9, 27, 0, 0, 0); // 25.10.2014, 22:00:00 GMT + 4
Somit wird der Konstruktor in der dritten Option praktisch unbrauchbar, da der Versatz im Voraus bekannt sein muss. Und es kann, wie gesagt, nicht so leicht erhalten werden. Die einzige Bibliothek, auf die ich gestoßen bin und die Olsons Datenbank zur Berechnung von Verschiebungen verwendet, ist timezone-JS. Das Problem bei der Verwendung dieser Bibliothek besteht darin, dass die zugrunde liegenden Bibliotheken (Datums- / Zeitauswahl) nichts darüber wissen und das Standarddatum intern aktiv verwenden. Die übrigen Bibliotheken, die mit dem Date-Objekt arbeiten, verweisen nicht explizit auf diese Basis und erhalten keine Aktualisierungen von dieser. (Korrigieren Sie mich in den Kommentaren.)

In Geschäftsanwendungen sind Zeitzonen nur dann von Bedeutung, wenn Datum und Uhrzeit angegeben sind. Wenn der Arbeitstag beispielsweise um 9:00 Uhr beginnt, erwarten Sie kaum, dass Ihr Kollege aus Wladiwostok um 15:00 Uhr mit der Arbeit beginnt. Zeitzonen sollten nicht berücksichtigt werden und in diesem Fall sollte das Datum in UTC angezeigt werden. Bei regelmäßigen Ereignissen, die gleichzeitig in verschiedenen Zeitzonen auftreten, wird jedoch weiterhin eine Zeitzone benötigt. Zum Beispiel beginnt Ihr tägliches Scrum für Sie um 10:00 Uhr und für Nowosibirsk um 13:00 Uhr. Dies ist übrigens genau der Unterschied zwischen GMT und UTC. UTC ist Zeit ohne Offset und GMT ist Zeit mit Offset 0. Lassen Sie mich anhand eines Beispiels erklären:

31.12.2014 20:59:59 GMT in der Moskauer Zeitzone sollte wie folgt aussehen 31.12.2014 23:59:59 31.12.2014 20:59:59 UTC in der Moskauer Zeitzone sollte wie folgt aussehen 31.12.2014 20:59 : 59
Aufgrund dieser Arithmetik sind sie meist verwirrt. Leider ist dieser Parameter überall durcheinander. Das Fehlen einer direkten Angabe der Zeitzone in JS wird als lokale Zeitzone interpretiert, und die Angabe von UTC und GMT ist gleichwertig.

Intl. Ich könnte, aber ich muss nicht. Insbesondere gibt es einen solchen Zeitzonenparameter, aber ein wenig weiter definiert der Standard: Die zu verwendende Zeitzone. Der einzige Wert, den Implementierungen erkennen müssen, ist "UTC". Abgesehen von Chrome unterstützt derzeit kein anderer Browser beliebige Zeitzonen.
Mit Zeitbereichen in JS ist alles wirklich schlecht - es gibt nichts Vergleichbares in der Sprache. Wenn Sie es gut machen wollen, machen Sie es selbst.

Was zu tun ist
  • Variante 1.
    Verwenden Sie keine beliebige Zeitzone. Die bevorzugte Option und wahrscheinlich die schmerzloseste. Das heißt, Sie haben nur die lokale Zeitzone und UTC. In diesen Fällen scheinen alle Browser alles zu haben, wenn auch nicht sehr praktisch. Darüber hinaus ist die Zeitzone für das Betriebssystem global festgelegt und es ist nicht koscher, sie für eine bestimmte Webanwendung zu ändern.
  • Option 2.
    Wenn beliebige Zeitzonen benötigt werden, verwenden Sie keinen Zeitstempel. Absolut. Speichern Sie die Zeit in der Sparkasse in der RFC-Zeile mit der Zeitzone. Ich bin mir nicht sicher, ob dies dazu beitragen wird, die Zeitzonenverschiebungen in einem browserübergreifenden Verständnis zu überwinden, aber zumindest Chrome ist sich solcher Verschiebungen bewusst.
  • Option 3.
    Die Situationen sind unterschiedlich und es kommt vor, dass die Zeit von jedem Gerät in der Datenbank aufgezeichnet wird. Das heißt, in Form eines Zeitstempels. Es gibt keine Möglichkeit zum Ausführen. Um die Zeit korrekt anzuzeigen, müssen Sie entweder die Zeitzone des Geräts oder die Zeitzone des Benutzers oder beides kennen und alle Schichten Hand in Hand berechnen. Sie können nicht ohne die Verwendung von Olsons Basis auskommen.
  • Es sollte die Moral dieser Fabel geben, aber ich habe nichts mehr hinzuzufügen. Ich sehe keine Fortschritte in den Entwürfen des ECMA-Standards, wahrscheinlich wird es keine geben.

In dieser Lektion werden wir das JavaScript-Datumsobjekt vorstellen und lernen, wie man es in der Praxis verwendet.

Datumserstellung - 4 Beispiele

In JavaScript erfolgt die Datumserstellung mithilfe des Date-Objekts. Das Date-Objekt stellt einen Punkt auf der Zeitachse dar und dient zum Speichern von Datum und Uhrzeit mit Millisekundengenauigkeit.

Beispiele zum Erstellen eines Datums in JavaScript.

1. Erstellung des aktuellen Datums und der aktuellen Uhrzeit.

Das aktuelle Datum und die aktuelle Uhrzeit in JavaScript abrufen ist erledigt durch Instanziieren eines Date-Objekts ohne Angabe von Parametern:

// das aktuelle Datum (das Datum und die Uhrzeit zum Zeitpunkt der Erstellung einer Instanz des Date-Objekts auf dem lokalen Computer des Benutzers) var now \u003d new Date (); // drucke zum Beispiel das aktuelle Datum in die Konsole console.log (now);

Wenn Sie nur das heutige Datum im Zeichenfolgenformat abrufen müssen, können Sie die toLocaleDateString-Methode verwenden:

Var now \u003d new Date (). ToLocaleDateString (); // 19.12.2019

Die aktuelle Uhrzeit des Benutzers kann folgendermaßen abgerufen werden:

Var now \u003d new Date (). ToLocaleTimeString (); // 11:02:48 var now \u003d new Date (). ToLocaleTimeString (). Slice (0, -3); // 11:02

Das Datum und die Uhrzeit im Zeichenfolgenformat können wie folgt abgerufen werden:

Var now \u003d new Date (). ToLocaleString (); // 19.12.2019, 11:02:48

2. Erstellung eines Datums durch Angabe der Anzahl der Millisekunden für das Date-Objekt seit dem 1. Januar 1970, 00:00:00 UTC.

// 1 Jahr (nicht schnell) \u003d 365 * 24 * 60 * 60 * 1000 \u003d 31536000000 ms // Erstellen wir beispielsweise das Datum 01.01.1971, 00:00:00 UTC: var date1 \u003d neues Datum (31536000000);

3. Erstellen eines Datums durch Angabe eines Datumsobjekts als Zeichenfolge.

Mit dieser Option zum Erstellen eines Datums versucht JavaScript, die an ihn übergebene Zeichenfolge zu verstehen und ein darauf basierendes Datum zu bilden. Das Konvertieren einer Zeichenfolge in ein Datum in JavaScript erfolgt mithilfe der Date.parse-Methode.

Zum Beispiel:

// ein Datum basierend auf einer Zeichenfolge im Format DD.MM.YY erstellen var date1 \u003d neues Datum ("05.11.19"); // ein Datum basierend auf einer Zeichenfolge im Format JJJJ-MM-TTThh erstellen: mm: ss.sss (T wird verwendet, um Datum und Uhrzeit zu trennen) var date2 \u003d neues Datum ("2015-02-24T21: 23"); // ein Datum basierend auf einer Zeichenfolge erstellen, die die Zeitzone angibt (Format JJJJ-MM-TTThh: mm: ss.sss ± hh: mm): var date3 \u003d neues Datum ("2015-02-24T22: 02 + 03: 00") ;;

4. Erstellen eines Datums durch Angabe der folgenden durch Kommas getrennten Parameter: Jahr (4 Ziffern), Monat (Zählung von 0), Tag (1..31), Stunden (0..23), Minuten (0..59), Sekunden (0..59), Millisekunden (0). .999). Darüber hinaus sind nur die ersten beiden Parameter erforderlich.

Ein Beispiel für die Erstellung eines Datums mit nur erforderlichen Parametern:

// Erstellungsdatum 01.01.2015 (nicht angegebene Parameter sind standardmäßig gleich: Nummer - 01, Stunden - 00, Minuten - 00, Sekunden - 00, Millisekunden - 000). var date1 \u003d neues Datum (2015.01); // Erstellungsdatum 24.01.2015, 21:23 var date2 \u003d neues Datum (2015,01,24,21,23);

Hinweis: Wenn Sie Datum und Uhrzeit in UTC einstellen müssen, können Sie die Date.UTC-Methode verwenden.

// 1 Beispiel var date1 \u003d Date.UTC (2015,1,1); var date2 \u003d neues Datum (Datum1); alert (date2.toUTCString ()); // 2. Beispiel var newDate \u003d new Date (Date.UTC (2015,1,1)); alert (newDate.toUTCString ());

Abrufen einzelner Datums- und Zeitkomponenten

JavaScript verwendet die folgenden Methoden, um die einzelnen Datums- und Zeitkomponenten abzurufen:

  • getFullYear () - gibt ein 4-stelliges Jahr zurück;
  • getMonth () - gibt den Monat im Format einer Zahl von 0 bis 11 zurück (0 - Januar, 1 - Februar, 2 - März, ..., 11 - Dezember);
  • getDate () - gibt den Tag des Monats von 1 bis 31 zurück;
  • getHours () - gibt die Anzahl der Stunden von 0 bis 23 zurück;
  • getMinutes () - gibt die Anzahl der Minuten von 0 bis 59 zurück;
  • getSeconds () - gibt die Anzahl der Sekunden von 0 bis 59 zurück;
  • getMilliseconds () - Gibt die Anzahl der Millisekunden von 0 bis 999 zurück.

Alle diese Methoden geben separate Datums- und Zeitkomponenten gemäß der auf dem lokalen Gerät des Benutzers festgelegten Zeitzone zurück.

// erstelle das Datum 11/11/2019 00:00 UTC var newDate \u003d neues Datum (Date.UTC (2019,11,11)); // Datumskomponenten abrufen, wenn die Ortszeit auf dem Gerät des Benutzers UTC + 10: 00 ist newDate.getFullYear (); // 2019 newDate.getMonth (); // 10 newDate.getDate (); // 11 newDate.getHours (); // 10 newDate.getMinutes (); // 0 newDate.getSeconds (); // 0 newDate.getMilliseconds (); // 0

Ein Beispiel, in dem wir den Benutzer je nach aktuellem Zeitintervall begrüßen werden:

// aktuelle Uhrzeit und Komponenten des Benutzers dieser Zeit abrufen var now \u003d new Date (), hour \u003d now.getHours (), minute \u003d now.getMinutes (), second \u003d now.getSeconds (), message \u003d ""; // Definiere eine Begrüßungsphrase basierend auf der Ortszeit des Benutzers if (Stunde<= 6) { message = "Доброе время суток"; } else if (hour <= 12) { message = "Доброе утро"; } else if (hour <= 18) { message = "Добрый день"; } else { message = "Добрый вечер"; } // выполним форматирование времени с использованием тернарного оператора minute = (minute < 10) ? "0" + minute: minute; second = (second < 10) ? "0" + second: second; hour = (hour < 10) ? "0" + hour: hour; message += ", сейчас " + hour + ":" + minute + ":" + second; // выведем приветствие и время в консоль console.log(message); // Добрый вечер, сейчас 22:50:39

In diesem Beispiel wird die Zeit mit dem ternären Operator im gewünschten Format angezeigt.

JavaScript verfügt über Analoga für diese Methoden zum Abrufen der einzelnen Datums- und Zeitkomponenten für die Zeitzone UTC + 0. Diese Methoden werden ähnlich benannt, jedoch mit dem Zusatz "UTC" nach "get": getUTCFullYear (), getUTCMonth (), getUTCDate (), getUTCHours (), getUTCMinutes (), getUTCSeconds (), getMilliseconds ().

Sie können den Wochentag in JavaScript mit der Methode getDay () abrufen.

Diese Methode gibt eine Zahl von 0 bis 6 zurück (0 - Sonntag, 1 - Montag, ..., 6 - Samstag).

Ein Beispiel, in dem wir den Wochentag von der numerischen in die Zeichenfolgendarstellung konvertieren:

Var Tage \u003d ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; // aktuelles Datum abrufen var now \u003d new Date (); // drucke den Wochentag in die Konsole console.log ("Heute" + Tage);

Mit der Methode getTime () können Sie die Anzahl der Millisekunden ermitteln, die seit dem 01.01.1970 00:00:00 UTC in JavaScript vergangen sind.

Mit der Methode getTimezoneOffset () können Sie den Unterschied (in Minuten) zwischen der Zeitzone des lokalen Geräts und UTC in JavaScript ermitteln.

Einstellen der einzelnen Datums- und Zeitkomponenten

In JavaScript können Sie einzelne Datums- und Zeitkomponenten mithilfe der folgenden Methoden für das Date-Objekt festlegen:

  • setFullYear (Jahr [, Monat, Datum]) - Festlegen des Jahres (zusätzlich können Sie einen weiteren Monat und Tag festlegen);
  • setMonth (Monat [, Datum]) - Einstellen des Monats von 0 bis 11 (0 - Januar, 1 - Februar, 2 - März, ..., 11 - Dezember); Darüber hinaus können Sie mit dieser Methode auch die Nummer festlegen.
  • setDate (Datum) - Einstellen der Nummer;
  • setHours (Stunde [, Min, Sek, ms]) - Stellt die Stunde von 0 bis 23 ein (Sie können zusätzlich Minuten, Sekunden und Millisekunden einstellen).
  • setMinutes (min [,) - setzt Minuten von 0 bis 59 (Sie können zusätzlich mehr Sekunden und Millisekunden einstellen);
  • setSeconds (sec,) - setzt Sekunden von 0 bis 59 (zusätzlich können Sie weitere Millisekunden einstellen);
  • setMilliseconds (ms) - Legt Millisekunden (0 bis 999) fest.

Alle diese Methoden dienen zum Einstellen von Datum und Uhrzeit in der auf dem Computer des Benutzers festgelegten Zeitzone.

// eine Instanz eines Date-Objekts erstellen, das das aktuelle Datum enthält var newDate \u003d new Date (); // setze das Jahr newDate.setFullYear (2019); // Jahr und Monat einstellen newDate.setFullYear (2019, 08); // set 20.09.2019 newDate.setFullYear (2019, 08, 20); // setze den Monat newDate.setMonth (05); // setze den Monat und den Tag newDate.setMonth (05, 15); // setze die Nummer newDate.setDate (28); // setze die Stunde newDate.setHours (13); // setze die Stunde und Minuten newDate.setHours (13,20);

In JavaScript werden Datum und Uhrzeit in der Zeitzone UTC + 0 mit den folgenden Methoden festgelegt: setUTCFullYear (), setUTCMonth (), setUTCDate (), setUTCHours (), setUTCMinutes (), setUTCSecondes (), setUTCMilliseconds ().

Das Einstellen von Datum und Uhrzeit anhand der Anzahl der Millisekunden seit dem 01.01.1970 00:00:00 UTC erfolgt mit und dann mit setTime ().

Darüber hinaus führt die Angabe falscher Datums- und Zeitkomponenten in JavaScript nicht zu Fehlern, sondern wird einfach automatisch auf die anderen verteilt.

Zum Beispiel:

// Nummer 44 wird wie folgt verteilt: 44 - 31 \u003d 13, 13. Februar 2019 newDate.setFullYear (2019, 01, 44);

Diese Technik kann verwendet werden, wenn Sie für einen bestimmten Zeitraum ein Datum benötigen, das von dem angegebenen Datum abweicht.

// Datum, das 7 Tage größer ist als newDate newDate.setDate (date1.getDate () + 7); // Datum, das 120 Sekunden unter newDate liegt newDate.setSeconds (date1.getSeconds () - 120); // Auf diese Weise können Sie den letzten Tag des Vormonats für newDate festlegen newDate.setDate (0);

Konvertieren eines Datums in eine Zeichenfolge und Formatieren

In JavaScript können Methoden zum Konvertieren eines Datums in eine Zeichenfolge in zwei Gruppen unterteilt werden.

Die erste Gruppe enthält Methoden, die dies so tun, wie es im Browser definiert ist: toString (), toDateString (), toTimeString (), toUTCString ().

Die toString () -Methode gibt die vollständige Datumsdarstellung zurück, toDateString () - nur das Datum, toTimeString () - nur die Uhrzeit, toUTCString () - die vollständige Datumsdarstellung, jedoch in der Zeitzone UTC + 0.

weil Die Zeichenfolgendarstellungen, die diese Methoden zurückgeben sollen, sind im Standard nicht klar definiert. Sie können in verschiedenen Browsern unterschiedlich sein.

Zur zweiten Gruppe Methoden können unter Berücksichtigung der Zeitzone und der Sprache des lokalen Computers zugewiesen werden: toLocaleString () - Datum und Uhrzeit, toLocaleDateString () - nur Datum, toLocaleTimeString () - nur Uhrzeit.

Die Methoden toLocaleString (), toLocaleDateString () und toLocaleTimeString () verfügen über zwei optionale Parameter. Der erste Parameter dient zur expliziten Angabe des Gebietsschemas, der zweite zur Angabe von Formatierungsoptionen.

Wenn das Gebietsschema nicht explizit festgelegt oder undefiniert ist, verwendet der Browser standardmäßig das Gebietsschema.

Darüber hinaus verfügt JavaScript über eine toISOString () -Methode. Es wird eine Zeichenfolge zurückgegeben, die Datum und Uhrzeit im ISO-Format enthält (JJJJ-MM-TTTHH: mm: ss.sssZ).

// Datum erstellen 15.04.2019 18:43:59 (in der Zeitzone des Benutzers) var newDate \u003d neues Datum (2019, 03, 15, 18, 43, 59); console.log (newDate.toString ()); // Mon Apr 15 2019 18:43:59 GMT + 1000 (Wladiwostok Standardzeit) console.log (newDate.toDateString ()); // Mon Apr 15 2019 console.log (newDate.toTimeString ()); // 18:43:59 GMT + 1000 (Wladiwostok, Standardzeit) console.log (newDate.toLocaleString ()); // 15.04.2019, 18:43:59 console.log (newDate.toLocaleDateString ()); // 15.04.2019 console.log (newDate.toLocaleTimeString ()); // 18:43:59 console.log (newDate.toUTCString ()); // Mo, 15. April 2019 08:43:59 GMT console.log (newDate.toISOString ()); // 2019-04-15T08: 43: 59.000Z

Methode zum Konvertieren eines Strings in ein Datum

JavaScript verwendet die Date.parse () -Methode, um eine Zeichenfolge in ein Datum zu konvertieren. Diese Methode kann eine Zeichenfolge konvertieren, wenn sie RFC2822- oder ISO 8601-kompatibel ist.

Berücksichtigen Sie in dieser Lektion den ISO 8601-Standard, für den eine Zeichenfolge im folgenden Format vorliegen muss: JJJJ-MM-TTThh: mm: ss.sssZ.

  • JJJJ - 4-stelliges Jahr;
  • MM - ein zweistelliger Monat (01 \u003d Januar, 02 \u003d Februar usw.);
  • DD - Tag des Monats, bestehend aus 2 Ziffern (01..31);
  • T - Zeichen zur Trennung von Datum und Uhrzeit;
  • hh - Anzahl der Stunden (00..23);
  • mm - Anzahl der Minuten (00..59);
  • ss - Anzahl der Sekunden (00..59);
  • sss - Anzahl der Millisekunden (0..999);
  • Z ist ein Zeichen, das bedeutet, dass die Zeit im UTC-Format angegeben wird. Wenn Sie die Zeitzone anstelle von UTC einstellen müssen, sollte der Buchstabe "Z" durch den Wert + hh: mm oder -hh.mm ersetzt werden.

Wenn die Zeichenfolge mit Datum und Uhrzeit nicht im RFC2822- oder ISO 8601-Format vorliegt, kann die JavaScript-Methode Date.parse () sie weiterhin konvertieren. In diesem Fall ist das Ergebnis jedoch möglicherweise nicht vorhersehbar.

Hallo!
Ich muss oft mit statistischen Daten arbeiten und es gibt viele davon, die an Daten gebunden sind. Darüber hinaus kann das gleiche Datum auf der Seite in verschiedenen Formaten verwendet werden (z. B. praktisch für ein Auto und bequem für eine Person). Ich denke, dass die meisten von Ihnen all diesen schrecklichen Code kennen, der mit der Verwendung eines Date-Objekts einhergeht.
Um beispielsweise das aktuelle Datum im Format TT.MM.JJJJ zu erhalten, müssen Sie Folgendes tun:
var d \u003d neues Datum (), fd \u003d d.getDate () + "." + (d.getMonth () + 1) + "." + d.getFullYear ();
Und wenn es viele solcher Zeilen gibt? Ist es leicht zu merken, dass in Javascript ein Monat von vorne beginnt, wenn Sie sich nicht nur darin entwickeln? Oder die Tatsache, dass es Millisekunden gibt, keine Sekunden, wie fast überall im Backend? Sie können einige der Probleme mit der beliebten Moment.js-Bibliothek lösen, aber sie funktioniert sehr langsam.
Die betreffende Bibliothek löst diese Probleme.
Bei Interesse empfehle ich Ihnen, diese kleine Rezension zu lesen.

TempusJS enthält viel syntaktischen Zucker für das Date-Objekt, ist also sehr schnell. Die Syntax der Bibliothek selbst ist recht einfach. Sie können das vorherige Beispiel beispielsweise folgendermaßen schreiben:
var fd \u003d tempus (). Format ("% d.% m.% Y");
Nun zur Geschwindigkeit. Im Spoiler sehen Sie einen Vergleich von Tempus mit Moment und der nativen Datumsformatierung (siehe oben):

Vergleich von nativem JS, MomentJS und TempusJS

Wir bekommen das aktuelle Datum
Native JS x 2.175.575 Ops / Sek. ± 0,75% (96 Läufe abgetastet) Moment x 284.864 Ops / Sek. ± 0,85% (96 Läufe abgetastet) Tempus x 2.086.081 Ops / Sek. ± 0,73% (97 Läufe abgetastet)
Formatierung
Native JS x 1.637.517 Ops / Sek. ± 0,61% (100 Läufe abgetastet) Moment x 8,808 Ops / Sek. ± 1,07% (100 Läufe abgetastet) Tempus x 942.815 Ops / Sek. ± 0,68% (94 Läufe abgetastet)
Automatische Datumserkennung und Analyse
Native JS x 11.204.316 ops / s ± 0,81% (88 abgetastete Läufe) Moment x 38.511 ops / s ± 1,41% (95 abgetastete Läufe) Tempus x 93.973 ops / s ± 1,06% (85 abgetastete Läufe)
Analysieren eines Datums nach Format
Moment x 46,293 ops / s ± 0,63% (100 abgetastete Läufe) Tempus x 109,947 ops / s ± 0,93% (99 abgetastete Läufe)
Analyse und Validierung
Moment x 44,588 ops / s ± 1,09% (90 Läufe abgetastet) Tempus x 103,439 ops / s ± 0,90% (94 Läufe abgetastet)
Die Ergebnisse wurden auf meinem Laptop in Google Chrome 30.0.1599.114 erhalten. Die Ergebnisse unterscheiden sich in anderen Browsern, aber das Verhältnis bleibt ungefähr gleich.
Für die Tests wurde die Bibliothek chartmark.js verwendet
Benchmarks für andere Funktionen können Sie sehen.

Die Vorteile dieser Bibliothek können also wie folgt geschrieben werden:

  • Unterstützt IE6 +, Chrome, Firefox, Opera;
  • Unterstützt Anrufketten;
  • Monate können mit 1 (Standard) anstatt mit Null beginnen.
  • Millisekunden können deaktiviert (Standard) oder aktiviert werden.
  • Schnelle Arbeit (Da in vielen Fällen das native Date-Objekt des Browsers verwendet wird, dessen Implementierung in schnelleren Sprachen geschrieben ist);
  • Unterstützt benutzerdefinierte Formate und Plugins
  • Die Datumsüberprüfung ist sehr schnell und hängt nur von den Funktionen ab, mit denen das Datum festgelegt wurde (da die Überprüfung bereits bei der Eingabe der Werte erfolgt und nicht separat berechnet wird).
  • Mehrsprachigkeit und automatische Erkennung der Sprache des Benutzers.

Hier werden wir nur über einige der Funktionen sprechen.

Formatieren und Parsen

Ein weiteres Beispiel für die Datumsformatierung. Wir verwenden hier auch die Anrufverkettung. Am Ende jeder Einstellung erhalten wir ein TempusDate-Objekt zurück, das wir weiter unten in der Kette verwenden können. Beispiel:
Tempus (). // erhalte die neue Datumsberechnung ((Monat: -1)). // verkleinere es um einen Monat Format ("% d.% m.% Y"); // Ausgabe als String
So erhalten wir den gleichen Tag, die gleiche Stunde und Sekunde, aber vor einem Monat. Dies ist nützlich, um Berichte für den letzten Monat abzurufen.

Das nächste Beispiel ist das Parsen eines Datums.
// Gibt ein TempusDate-Objekt mit dem Datum "2013-11-18" zurück. Tempus ("11/18/2013"); // Gibt ein TempusDate-Objekt mit dem Datum "2013-12-12" zurück ("2013-12-12", "% Y-% m-% d"));
Tempus kann einige bekannte Formate automatisch erkennen. Sie können auch ein bestimmtes Format angeben, dann ist die Analyse schneller. Außerdem können Sie das Datum festlegen, das zurückgegeben wird, wenn die Analyse fehlschlägt:
// Weil "123" entspricht nicht dem Format "% d.% M.% Y", // dann wird ein Objekt mit dem Datum 2013-01-01 als Tempus zurückgegeben ("123", "% d.% M.% Y", Tempus ());
Die Liste der Standardformate kann angezeigt werden

Ändern wir nun das Format des bereits formatierten Datums
// Tempus "2013-11-05" ("05.11.2013"). Format ("% Y-% m-% d"); // Oder so // "Oktober, 12" Tempus ("2013-10-12 12:31:01", "% Y-% m-% d% H:% M:% S"). Format ("% B,% d);

Sie können die Lokalisierung auch zum Formatieren verwenden. Standardmäßig wird die Sprache des Benutzers ausgewählt (aus dem Browser übernommen) oder die Standardsprache, wenn die Sprache des Benutzers nicht unter den verfügbaren Tempus-Sprachen gefunden wird.
// Setze die Sprache tempus.lang ("ru"); // Standardmäßig verwenden wir das Format // "November 05" tempus (1383609600) .format ("% B,% d");
Im Moment gibt es nur zwei Sprachen - Russisch und Englisch, daher helfe ich gerne weiter.

Validierung

Die Datumsüberprüfung lautet wie folgt:
// Gibt einen falschen Tempus zurück ("08/32/2013", "% d.% M.% Y"). Valid (); // Gibt den wahren Tempus zurück ("00:00 01.01.2012", "% H:% M% d.% M.% Y"). Valid ();

Im Fehlerfall können Sie sich die Felder ansehen, in denen er aufgetreten ist - überall dort, wo der Wert nicht falsch ist:
// Rückgabe ("Jahr": - 5, "Monat": falsch, "Tag": falsch, "Stunden": falsch, // "Minuten": falsch, "Sekunden": falsch, "Millisekunden": falsch) Tempus (). Jahr (-5). // setze das Jahr \u003d -5, d.h. ungültige Fehler (); // Hole das Objekt mit Fehlern

Datumsbereiche

Manchmal müssen wir die Anzahl der Jahre (z. B. Alter), Monate, Tage usw. ermitteln. zwischen zwei Daten. Dazu können wir die Methode Between verwenden, mit der die Differenz zwischen zwei Daten und Rückgaben im gewünschten Format ermittelt wird ("Jahr", "Monat", "Tag", "Stunden", "Minuten", "Sekunden", "Millisekunden").
Hier ist ein einfaches Beispiel für die Anzahl der Monate zwischen dem 1. November 2013 und dem 5. Mai 2014:
// Gibt 6 tempus () zurück. Between (tempus (), "month");
Oder wie viele Stunden bis zum neuen Jahr übrig sind
Tempus (). zwischen (Tempus (), "Stunden");
Im letzten Beispiel sehen Sie, dass ich nur das Jahr angegeben habe. Wenn Sie einen Wert für ein Array oder Objekt festlegen, fehlen die Werte
mit dem Minimum gefüllt. Die Liste der Konstanten mit Mindestwerten finden Sie in der Dokumentation.

Außerdem können wir jedes Datum mit der Berechnungsfunktion ändern:
// Gibt ein TempusDate mit dem Datum 2012-01-01 zurück tempus (). Calc ((Jahr: 1, Monat: -4, Tag: -1));

Benutzerdefinierte Formate

Wir wenden unser eigenes Format für den Monat an, das Werte von 1 bis 12 (und nicht von 01 bis 12) annehmen kann:
// Registriere ein neues Format tempus.registerFormat ("% q", // Direktive -% q Funktion (Datum) (// Hier geben wir die Formatierungsfunktion an, d. H. Was wird für% q zurückgegeben? Return date.month ();) , function (value) (// Und hier ist die Analysefunktion var v \u003d Number (value); return (month: (isNaN (v)? undefined: v));), 1, // Die Mindestlänge, die der Wert 2 annehmen kann , // Maximale Länge "Zahl" // Typ); // Testen // Gibt "01.1.2013" zurück; Tempus ((Jahr: 2013, Monat: 1, Tag: 1)). Format ("% d.% q.% Y"); // Rückgabe ("Jahr": 2013, "Monat": 2, "Tag": 10, "Stunden": 0, "Minuten": 0, "Sekunden": 0); Tempus ("10.2.2013", "% d.% q.% Y"). get ();
Bei der Registrierung werden Sie feststellen, dass einige Parameter separat festgelegt werden, während ein regulärer Ausdruck verwendet werden kann. Eigentlich war es anfangs dort, aber nachdem es aufgegeben wurde, erhöhte sich die Geschwindigkeit um ein Dutzend Mal.
Wenn Sie ein Format entfernen müssen, verwenden Sie unregisterFormat:
tempus.unregisterFormat ("% d"); // Gibt "% d.01.2013" zurück, weil Direktive% d existiert nicht mehr. tempus.format ((Jahr: 2013, Monat: 1, Tag: 1), "% d.% m.% Y");

Getter / Setter

Sie können einige Werte mit den Funktionen Jahr (), Monat (), Tag (), Stunden (), Minuten (), Sekunden (), Millisekunden (), Tag der Woche (), utc (), Zeitstempel () oder Set abrufen / festlegen (). Zum Beispiel:
Tempus (). // Das aktuelle Datum Jahr (1900) abrufen. // Lass es wie es ist, aber setze es auf 1900 leapYear (); // Überprüfen Sie, ob es sich um ein Schaltjahr handelt, in diesem Fall false tempus (). Year (); // Und so erhalten wir das aktuelle Jahr in numerischer Form

Daten generieren

Sie können ein Datum auf viele Arten generieren. Die vollständige Liste der Parameter finden Sie in der Dokumentation. Hier ist ein minimales Beispiel.
// gibt zurück ["29.03.2013", "30.03.2013", "31.03.2013", "01.04.2013", "02.04.2013"]; tempus.generate ((Datum von: "20130329", Format von: "% Y.% m.% d", Datum von: "20130402", Zeitraum: (Tag: 1), Format: "% d.% m.% Y" ));
Dies kann nützlich sein, um Diagramme nach Datum anzuzeigen und das Anzeigeformat direkt auf dem Client zu ändern, ohne Anforderungen an das Backend zu stellen. Das Datum kann entweder als Array oder als Objekt generiert werden, wobei die Daten selbst die Schlüssel sind (dies ist nützlich, wenn wir ein Ereignis an ein Datum binden müssen, z. B. wenn wir unseren eigenen Kalender erstellen). Daten können auch nach Tag, Woche, Monat, Stunde, Jahr gruppiert werden - was auch immer. Dies kann auch auf den Kalender angewendet werden.

Plugins

Und zu guter Letzt Plugins. Hier erweitern wir die Fabrik, um ein zufälliges Datum zu generieren. Außerdem benötigen wir die TempusDate-Klasse, die in tempus.classes () zu finden ist. Hier ist ein Beispiel-Plugin:
(Funktion (Tempus) (var TempusDate \u003d tempus.classes ("TempusDate"); tempus.randomDate \u003d function () (var date \u003d new TempusDate (); date.year (Math.floor ((Math.random () *) tempus.MAX_YEAR - tempus.MIN_YEAR)) + tempus.MIN_YEAR)). Monat (Math.floor ((Math.random () * (tempus.MAX_MONTH - tempus.MIN_MONTH)) + tempus.MIN_MONTH)). Tag (Math. Etage ((Math.random () * (date.dayCount () - tempus.MIN_DAY)) + tempus.MIN_DAY)). Stunden (Math.floor ((Math.random () * (tempus.MAX_HOURS - tempus.MIN_HOURS)) ) + tempus.MIN_HOURS)). Minuten (Math.floor ((Math.random () * (tempus.MAX_MINUTES - tempus.MIN_MINUTES)) + tempus.MIN_MINUTES)). Sekunden (Math.floor ((Math.random ()) * (tempus.MAX_SECONDS - tempus.MIN_SECONDS)) + tempus.MIN_SECONDS)); Rückgabedatum;);)) (tempus); // Jetzt können wir Daten wie folgt erstellen var someRandomDate \u003d tempus.randomDate ();
Ich denke, dass es auf diese Weise möglich sein wird, Widgets bequem mit jQuery + Tempus, Angular + Tempus usw. zu schreiben.

Quellcodes

Sie können installieren, indem Sie die Quellen vom Github herunterladen:
https://github.com/crusat/tempus-js/releases
Oder über die Laube:
$ bower install tempus
Sie benötigen nur eine Datei - tempus.js oder tempus.min.js.

Ich hoffe, dass diese Bibliothek nützlich sein wird, und es wäre auch interessant zu wissen, was darin fehlt, um die Bibliothek in die richtige Richtung weiterzuentwickeln. Vielen Dank für Ihre Aufmerksamkeit!
P.S. Danke für die Einladung!

Verwenden Sie new Date (), um ein neues Date-Objekt mit dem aktuellen Datum und der aktuellen Uhrzeit zu erstellen.

beachten Sie, dass Datum () ohne Argumente aufrufbar, entspricht neues Datum (Date.now ()) .

Sobald Sie ein Datumsobjekt haben, können Sie eine von mehreren verfügbaren Methoden verwenden, um seine Eigenschaften abzurufen (z. B. getFullYear (), um ein vierstelliges Jahr zu erhalten).

Im Folgenden finden Sie einige gängige Datumsmethoden.

Holen Sie sich das aktuelle Jahr

var year \u003d (neues Datum ()). getFullYear (); console.log (Jahr); // Beispielausgabe: 2016

Holen Sie sich den aktuellen Monat

var month \u003d (neues Datum ()). getMonth (); console.log (Monat); // Beispielausgabe: 0

Beachten Sie, dass 0 \u003d Januar. Dies liegt daran, dass die Monate von reichen 0 Vor 11 Daher ist es oft wünschenswert, dem Index +1 hinzuzufügen.

Holen Sie sich den aktuellen Tag

var day \u003d (neues Datum ()). getDate (); console.log (Tag); // Beispielausgabe: 31

Holen Sie sich die aktuelle Stunde

var Stunden \u003d (neues Datum ()). getHours (); console.log (Stunden); // Beispielausgabe: 10

Aktuelle Minuten abrufen

var Minuten \u003d (neues Datum ()). getMinutes (); console.log (Minuten); // Beispielausgabe: 39

Holen Sie sich die aktuellen Sekunden

var Sekunden \u003d (neues Datum ()). getSeconds (); console.log (zweite); // Beispielausgabe: 48

Holen Sie sich die aktuellen Millisekunden

Verwenden Sie die Methode getMilliseconds, um die Millisekunden (0 bis 999) einer Instanz eines Date-Objekts abzurufen.

Var Millisekunden \u003d (neues Datum ()). GetMilliseconds (); console.log (Millisekunden); // Ausgabe: Millisekunden im Moment

Konvertieren Sie die aktuelle Uhrzeit und das aktuelle Datum in eine lesbare Zeichenfolge

var now \u003d neues Datum (); // Datum in eine Zeichenfolge im UTC-Zeitzonenformat konvertieren: console.log (now.toUTCString ()); // Ausgabe: Mi, 21 Jun 2017 09:13:01 GMT

Die statische Date.now () -Methode gibt die Anzahl der Millisekunden seit dem 1. Januar 1970 00:00:00 UTC zurück. Verwenden Sie die getTime-Methode, um die Anzahl der Millisekunden seit diesem Zeitpunkt mithilfe einer Date-Objektinstanz abzurufen.

// erhalte jetzt Millisekunden mit der statischen Methode von Date console.log (Date.now ()); // Millisekunden mit der Methode getTime of Date abrufen instance console.log ((new Date ()). getTime ());