Ich habe Datums- und Uhrzeitangaben in einer bestimmten Zeitzone als Zeichenfolge und möchte diese in die Ortszeit konvertieren. Ich weiß jedoch nicht, wie ich die Zeitzone im Date-Objekt festlegen soll.
Zum Beispiel habe ich Feb 28 2013 7:00 PM ET,
dann kann ich
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
Soweit ich weiß, kann ich entweder die UTC-Zeit oder die Ortszeit einstellen. Aber wie stelle ich die Zeit in einer anderen Zeitzone ein?
Ich habe versucht, den Offset von UTC zu addieren / subtrahieren, aber ich weiß nicht, wie ich der Sommerzeit entgegenwirken kann. Ich bin mir nicht sicher, ob ich in die richtige Richtung gehe.
Wie kann ich die Zeit von einer anderen Zeitzone in die Ortszeit in Javascript konvertieren?
javascript
timezone
gepflastert
quelle
quelle
Antworten:
Hintergrund
Das JavaScript-
Date
Objekt verfolgt die Zeit in UTC intern, akzeptiert jedoch normalerweise Eingaben und erzeugt Ausgaben in der Ortszeit des Computers, auf dem es ausgeführt wird. Es gibt nur sehr wenige Möglichkeiten, mit der Zeit in anderen Zeitzonen zu arbeiten.Die interne Darstellung eines
Date
Objekts ist eine einzelne Zahl, die die Anzahl der Millisekunden darstellt, die seitdem vergangen sind1970-01-01 00:00:00 UTC
, ohne Rücksicht auf Schaltsekunden. Im Date-Objekt selbst ist keine Zeitzone oder kein Zeichenfolgenformat gespeichert. Wenn verschiedene Funktionen desDate
Objekts verwendet werden, wird die lokale Zeitzone des Computers auf die interne Darstellung angewendet. Wenn die Funktion eine Zeichenfolge erzeugt, können die Gebietsschemainformationen des Computers berücksichtigt werden, um zu bestimmen, wie diese Zeichenfolge erzeugt wird. Die Details variieren je nach Funktion und einige sind implementierungsspezifisch.Die einzigen Operationen, die das
Date
Objekt mit nicht lokalen Zeitzonen ausführen kann, sind:Es kann eine Zeichenfolge analysieren, die einen numerischen UTC-Versatz von einer beliebigen Zeitzone enthält. Damit wird der zu analysierende Wert angepasst und das UTC-Äquivalent gespeichert. Die ursprüngliche Ortszeit und der Offset werden im resultierenden
Date
Objekt nicht beibehalten . Beispielsweise:In Umgebungen, in denen die ECMASCript Internationalization API (auch bekannt als "Intl") implementiert ist , kann ein
Date
Objekt eine länderspezifische Zeichenfolge erstellen, die an eine bestimmte Zeitzonen- ID angepasst ist. Dies wird über dietimeZone
OptiontoLocaleString
und ihre Variationen erreicht. Die meisten Implementierungen unterstützen IANA-Zeitzonen-IDs, z'America/New_York'
. Beispielsweise:Die meisten modernen Umgebungen unterstützen den vollständigen Satz von IANA-Zeitzonen-IDs ( siehe Kompatibilitätstabelle hier ). Doch bedenken Sie, dass die einzige Kennung erforderlich von Intl unterstützt werden soll
'UTC'
, so sollten Sie sorgfältig überprüfen , ob Sie älteren Browser oder atypische Umgebungen unterstützen müssen (zum Beispiel leichte IoT - Geräte).Bibliotheken
Es gibt mehrere Bibliotheken, mit denen mit Zeitzonen gearbeitet werden kann. Obwohl sie das
Date
Objekt immer noch nicht anders verhalten können, implementieren sie normalerweise die Standard-IANA-Zeitzonendatenbank und bieten Funktionen für die Verwendung in JavaScript. Moderne Bibliotheken verwenden die von der Intl-API bereitgestellten Zeitzonendaten. Ältere Bibliotheken haben jedoch normalerweise Overhead, insbesondere wenn Sie in einem Webbrowser ausgeführt werden, da die Datenbank etwas größer werden kann. In einigen dieser Bibliotheken können Sie den Datensatz auch selektiv reduzieren, entweder nach Zeitzonen und / oder nach Datumsbereich, mit dem Sie arbeiten können.Hier sind die zu berücksichtigenden Bibliotheken:
Intl-basierte Bibliotheken
Neuentwicklungen sollten aus einer dieser Implementierungen wählen, deren Zeitzonendaten auf der Intl-API basieren:
Nicht-internationale Bibliotheken
Diese Bibliotheken werden verwaltet, müssen jedoch ihre eigenen Zeitzonendaten verpacken, die sehr groß sein können.
* Während Moment und Moment-Timezone zuvor empfohlen wurden, bevorzugt das Moment-Team jetzt Benutzer, die Luxon für die Neuentwicklung ausgewählt haben.
Ausgelaufene Bibliotheken
Diese Bibliotheken wurden offiziell eingestellt und sollten nicht mehr verwendet werden.
Zukünftige Vorschläge
Der TC39-Zeitvorschlag zielt darauf ab, einen neuen Satz von Standardobjekten für die Arbeit mit Datum und Uhrzeit in der JavaScript-Sprache selbst bereitzustellen. Dies umfasst die Unterstützung eines zeitzonensensitiven Objekts.
quelle
var date_time = new Date()
der Wert vondate_time
(für mich in AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
scheint und so damit es es hat eine Zeitzone gespeichert. Wie kann ich sicherstellen, dassdate_time
nur die UTC-Zeit ohne Zeitzone angegeben wird?new Date().getTime();
Wie Matt Johnson sagte
Obwohl der Browser beim Erstellen eines Datums keine IANA-Zeitzonen lesen kann oder über Methoden zum Ändern der Zeitzonen für ein vorhandenes Datumsobjekt verfügt, scheint es einen Hack zu geben:
quelle
toLocaleString
den umgekehrten Effekt erzielen könnte , und ja, das sollte allgemein bekannt sein! schreibe einen Artikel darüber und erwähne mich :-)Date
Objekt, das es zurückgibt, eine Lüge ist. Selbst im gezeigten Beispiel enthält die Zeichenfolgenausgabe die Zeitzone des lokalen Computers. Auf meinem Computer steht in beiden Ergebnissen "GMT-0700 (Pacific Daylight Time)", wobei dies nur für den ersten korrekt ist (Toronto befindet sich tatsächlich in der Eastern Time). Über die reine Zeichenfolgenausgabe hinaus wurde der Zeitstempel imDate
Objekt gespeichert zu einem anderen Zeitpunkt verschoben. Dies kann eine nützliche Technik sein,Date
bringt jedoch viele Einschränkungen mit sich - vor allem, dass Objektfunktionen keine normale Ausgabe haben.Sie können einen Zeitzonenversatz angeben
new Date()
, zum Beispiel:oder
Da
Date
die UTC-Zeit gespeichert wird (dhgetTime
in UTC zurückgegeben wird), konvertiert Javascript die Zeit in UTC. Wenn Sie beispielsweisetoString
Javascript aufrufen , konvertiert die UTC-Zeit in die lokale Zeitzone des Browsers und gibt die Zeichenfolge in der lokalen Zeitzone zurück, dh wenn ich sie verwendeUTC+8
::Sie können auch die normale
getHours/Minute/Second
Methode verwenden:(Dies
8
bedeutet, dass nach der Umrechnung der Zeit in meine OrtszeitUTC+8
die Stundenzahl lautet8
.)quelle
Dies sollte Ihr Problem lösen, bitte zögern Sie nicht, Korrekturen anzubieten. Diese Methode berücksichtigt auch die Sommerzeit für das angegebene Datum.
Verwendung mit Zeitzone und Ortszeit:
quelle
tzDate
direkt zurückkehren?Ich fand, dass der am meisten unterstützte Weg, dies zu tun, ohne sich um eine Bibliothek eines Drittanbieters zu sorgen, darin bestand
getTimezoneOffset
, den entsprechenden Zeitstempel zu berechnen oder die Uhrzeit zu aktualisieren und dann die normalen Methoden zu verwenden, um das erforderliche Datum und die erforderliche Uhrzeit zu erhalten.BEARBEITEN
Ich habe zuvor
UTC
Methoden verwendet, um die Datumstransformationen durchzuführen, was falsch war. Wenn Sie den Versatz zur Zeit hinzufügen, werden bei Verwendung der lokalenget
Funktionen die gewünschten Ergebnisse zurückgegeben.quelle
timezone_offset
?timezone_offset
hätte sein sollenoffset
oder umgekehrt. Ich habe meine Antwort so bearbeitet, dass der richtige Variablenname angezeigt wird.Ich bin auf ein ähnliches Problem mit Komponententests gestoßen (insbesondere im Scherz, wenn die Komponententests lokal ausgeführt werden, um die Snapshots zu erstellen, und der CI-Server dann (möglicherweise) in einer anderen Zeitzone ausgeführt wird, wodurch der Snapshot-Vergleich fehlschlägt). Ich verspottete unsere
Date
und einige der unterstützenden Methoden wie folgt:quelle
Versuchen Sie es mit ctoc ab npm. https://www.npmjs.com/package/ctoc_timezone
Es hat einfache Funktionen zum Ändern von Zeitzonen (die meisten Zeitzonen um 400) und alle benutzerdefinierten Formate, die angezeigt werden sollen.
quelle
Aufbauend auf den obigen Antworten verwende ich diesen nativen Einzeiler, um die lange Zeitzonenzeichenfolge in die Zeichenfolge mit drei Buchstaben umzuwandeln:
Dies gibt PDT oder PST je nach angegebenem Datum. In meinem speziellen Anwendungsfall, der sich auf Salesforce (Aura / Lightning) entwickelt, können wir die Benutzerzeitzone im Langformat vom Backend abrufen.
quelle
Ich weiß, dass es 3 Jahre zu spät ist, aber vielleicht kann es jemand anderem helfen, weil ich so etwas nicht gefunden habe, außer der Moment-Zeitzonen-Bibliothek, die nicht genau das ist, was er hier verlangt.
Ich habe etwas Ähnliches für die deutsche Zeitzone gemacht. Dies ist aufgrund der Sommerzeit und der Schaltjahre, in denen Sie 366 Tage haben, etwas komplex.
Möglicherweise ist ein wenig Arbeit mit der Funktion "isDaylightSavingTimeInGermany" erforderlich, während sich verschiedene Zeitzonen zu unterschiedlichen Zeiten der Sommerzeit ändern.
Schauen Sie sich trotzdem diese Seite an: https://github.com/zerkotin/german-timezone-converter/wiki
Die Hauptmethoden sind: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone
Ich habe mich bemüht, es zu dokumentieren, damit es nicht so verwirrend wird.
quelle
Versuchen Sie: Datum von Zeitzone , es löst das erwartete Datum mithilfe von nativ verfügbar auf
Intl.DateTimeFormat
.Ich habe diese Methode bereits seit einigen Jahren in einem meiner Projekte verwendet, aber jetzt habe ich beschlossen, sie als kleines Betriebssystemprojekt zu veröffentlichen :)
quelle
Für Ionic-Benutzer hatte ich die Hölle damit, weil
.toISOString()
es mit der HTML-Vorlage verwendet werden muss.Dadurch wird das aktuelle Datum erfasst, es kann jedoch natürlich zu früheren Antworten für ein ausgewähltes Datum hinzugefügt werden.
Ich habe es damit behoben:
Der * 60000 zeigt die UTC -6 an, bei der es sich um CST handelt. Unabhängig von der benötigten Zeitzone können Anzahl und Differenz geändert werden.
quelle
Vielleicht hilft dir das
quelle
War vor dem gleichen Problem, benutzte dieses
Console.log (Date.parse ("13. Juni 2018, 10:50:39 GMT + 1"));
Es wird Millisekunden zurückgeben, auf die Sie überprüfen können, ob +100 Timzone die britische Zeit initialisiert. Hoffe, es hilft !!
quelle