Ziel: Suchen Sie die URL local time
und UTC time offset
erstellen Sie sie im folgenden Format.
Beispiel-URL: / Actions / Sleep? Duration = 2002-10-10T12: 00: 00−05: 00
Das Format basiert auf der W3C-Empfehlung: http://www.w3.org/TR/xmlschema11-2/#dateTime
Die Dokumentation sagt:
Zum Beispiel ist 2002-10-10T12: 00: 00−05: 00 (Mittag am 10. Oktober 2002, zentrale Sommerzeit sowie Eastern Standard Time in den USA) gleich 2002-10-10T17: 00: 00Z, fünf Stunden später als 2002-10-10T12: 00: 00Z.
Nach meinem Verständnis muss ich meine Ortszeit anhand des neuen Datums () ermitteln und dann die Funktion getTimezoneOffset () verwenden, um die Differenz zu berechnen, und sie dann an das Ende der Zeichenfolge anhängen.
1. Holen Sie sich die Ortszeit mit Format
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)
Ausgabe
2013-07-02T09:00:00
2. Holen Sie sich die UTC-Zeit um eine Stunde versetzt
var offset = local.getTimezoneOffset() / 60;
Ausgabe
7
3. URL erstellen (nur Zeitteil)
var duration = local + "-" + offset + ":00";
Ausgabe:
2013-07-02T09:00:00-7:00
Die obige Ausgabe bedeutet, dass meine Ortszeit 2013/07/02 9 Uhr ist und die Differenz zu UTC 7 Stunden beträgt (UTC ist 7 Stunden vor Ortszeit).
Bisher scheint es zu funktionieren, aber was ist, wenn getTimezoneOffset () einen negativen Wert wie -120 zurückgibt?
Ich frage mich, wie das Format in einem solchen Fall aussehen soll, da ich aus dem W3C-Dokument nichts herausfinden kann. Danke im Voraus.
toISOString()
seit 2009 aufgenommen hat . Siehe meine Antwort unten.Antworten:
Das Folgende sollte ordnungsgemäß und für alle Browser funktionieren (danke an @MattJohnson für den Tipp)
quelle
getTimezoneOffset()
Gibt das entgegengesetzte Vorzeichen des Formats zurück, das für die von Ihnen angegebene Spezifikation erforderlich ist.Dieses Format wird auch als ISO8601 oder genauer als RFC3339 bezeichnet .
In diesem Format wird UTC mit einer
Z
Weile dargestellt, während alle anderen Formate durch einen Versatz von UTC dargestellt werden. Die Bedeutung ist dieselbe wie bei JavaScript, aber die Reihenfolge der Subtraktion ist invertiert, sodass das Ergebnis das entgegengesetzte Vorzeichen trägt.Außerdem gibt es keine Methode für das
Date
aufgerufene native Objektformat
, sodass Ihre Funktion in # 1 fehlschlägt, es sei denn, Sie verwenden eine Bibliothek, um dies zu erreichen. Siehe diese Dokumentation .Wenn Sie eine Bibliothek suchen, die direkt mit diesem Format arbeiten kann, empfehle ich, moment.js auszuprobieren . Tatsächlich ist dies das Standardformat, sodass Sie dies einfach tun können:
Dies ist eine bewährte browserübergreifende Lösung mit vielen weiteren nützlichen Funktionen.
quelle
Ich denke, es lohnt sich zu bedenken, dass Sie die angeforderten Informationen mit nur einem einzigen API-Aufruf der Standardbibliothek erhalten können ...
Sie müssten Text austauschen, wenn Sie das Trennzeichen 'T' hinzufügen, das 'GMT-' entfernen oder das ': 00' an das Ende anhängen möchten.
Aber dann können Sie leicht mit den anderen Optionen spielen, wenn Sie z. Verwenden Sie die 12-Stunden-Zeit oder lassen Sie die Sekunden usw. weg.
Beachten Sie, dass ich Schweden als Gebietsschema verwende, da es eines der Länder ist, die das ISO 8601-Format verwenden. Ich denke, die meisten ISO-Länder verwenden dieses 'GMT-4'-Format für den Zeitzonenversatz außer Kanada, das die Zeitzonenabkürzung verwendet, z. "EDT" für östliche Sommerzeit.
Sie können dasselbe von der neueren Standard-i18n-Funktion "Intl.DateTimeFormat ()" erhalten, müssen jedoch angeben, dass die Uhrzeit über die Optionen angegeben werden soll, da sonst nur das Datum angegeben wird.
quelle
Dies ist meine Funktion für die Zeitzone des Kunden, es ist leicht und einfach
quelle
Überprüfen Sie dies:
quelle
Kein moment.js erforderlich: Hier ist eine vollständige Roundtrip- Antwort von einem Eingabetyp von "datetime-local", der eine ISOLocal-Zeichenfolge in UTCseconds bei GMT und zurück ausgibt:
quelle
Nur meine beiden schicken hierher
Ich war mit Datumsangaben mit diesem Problem konfrontiert. Ich habe also Folgendes getan:
Speichern Sie dann das Datum in db, um es anhand einer Abfrage vergleichen zu können.
Installieren
moment-timezone
quelle
Meine Antwort ist eine geringfügige Abweichung für diejenigen, die nur das heutige Datum in der lokalen Zeitzone im Format JJJJ-MM-TT wünschen.
Lass mich deutlich sein:
Mein Ziel: Holen Sie sich das heutige Datum in die Zeitzone des Benutzers, aber formatiert als ISO8601 (JJJJ-MM-TT)
Hier ist der Code:
Dies funktioniert, weil das Gebietsschema Schweden das ISO 8601-Format verwendet.
quelle
Hier sind die Funktionen, die ich zu diesem Zweck verwendet habe:
quelle
Sie können dies mit ein paar einfachen Erweiterungsmethoden erreichen. Die folgende Datumserweiterungsmethode gibt nur die Zeitzonenkomponente im ISO-Format zurück. Anschließend können Sie eine andere für den Datums- / Zeitteil definieren und diese zu einer vollständigen Datums- / Zeitversatzzeichenfolge kombinieren.
Anwendungsbeispiel:
Ich weiß, es ist 2020 und die meisten Leute verwenden Moment.js wahrscheinlich schon, aber eine einfache Lösung zum Kopieren und Einfügen ist manchmal immer noch praktisch.
(Der Grund, warum ich die Datums- / Zeit- und Versatzmethoden aufgeteilt habe, ist, dass ich eine alte Datejs- Bibliothek verwende, die bereits eine flexible
toString
Methode mit benutzerdefinierten Formatspezifizierern bietet , aber den Zeitzonenversatz nicht enthält. Daher habe ichtoISOLocaleString
für jeden ohne hinzugefügt sagte Bibliothek.)quelle