Holen Sie sich die Zeitzone vom Browser des Benutzers mit moment (timezone) .js

76

Was ist der beste Weg, um die Zeitzone des Clients abzurufen und in eine andere Zeitzone zu konvertieren, wenn moment.js und moment-timezone.js verwendet werden

Ich möchte herausfinden, was die Zeitzone des Kunden ist, und später sein Datum und seine Uhrzeit in eine andere Zeitzone umwandeln.

Hat jemand Erfahrung damit?

nemo_87
quelle
Jetzt ist da Moment eingestellt. Unter stackoverflow.com/a/34602679/4050261 finden Sie einen supereinfachen Einzeiler ohne Bibliotheken.
Adarsh ​​Madrecha

Antworten:

17
var timedifference = new Date().getTimezoneOffset();

Dies gibt die Differenz zwischen der Zeitzone des Clients und der UTC-Zeit zurück. Sie können dann damit herumspielen, wie Sie möchten.

jogoe
quelle
47
Dadurch wird die aktuelle Zeitzone versetzt . Nicht die Zeitzone. Der Versatz kann sich beispielsweise aufgrund der Sommerzeit ändern. Siehe "Zeitzone! = Versatz" im Zeitzonen-Tag-Wiki
Matt Johnson-Pint
9
@ MattJohnsons Antwort ist die wahre Antwort auf diese Frage. Technisch gesehen ist diese Antwort falsch, da sie sich auf den Offset bezieht und nicht auf die Zeitzone (verschiedene Konzepte).
Dudewad
1
Dies funktioniert nicht in Firefox, new Date () erstellt ein Datumsobjekt in der UTC-Zeitzone, daher ist es sinnlos, TimezoneOffset () darauf abzurufen
Krzysztof Krasoń
Wie spielen wir also mit dem Moment damit herum?
Raymond Chen
220

Verwenden Sie bei Verwendung von moment.js:

var tz = moment.tz.guess();

Es wird eine IANA-Zeitzonen-ID zurückgegeben, z. B. America/Los_Angelesfür die US-Pazifik-Zeitzone.

Es ist hier dokumentiert .

Intern wird zunächst versucht, die Zeitzone mithilfe des folgenden Aufrufs vom Browser abzurufen:

Intl.DateTimeFormat().resolvedOptions().timeZone

Wenn Sie nur auf moderne Browser abzielen, die diese Funktion unterstützen, und für nichts anderes Moment-Timezone benötigen, können Sie dies einfach direkt aufrufen.

Wenn Moment-Timezone kein gültiges Ergebnis von dieser Funktion erhält oder wenn diese Funktion nicht vorhanden ist, "errät" sie die Zeitzone, indem mehrere verschiedene Daten und Zeiten gegen das DateObjekt getestet werden, um zu sehen, wie es sich verhält. Die Vermutung ist normalerweise eine ausreichend gute Annäherung, kann jedoch nicht garantiert genau mit der Zeitzoneneinstellung des Computers übereinstimmen.

Matt Johnson-Pint
quelle
2
Tolle Antwort - Upvoted! Bitte verwenden Sie auch momet-timezoneVersion 0.5.4 oder höher ... folgen Sie diesem Thread für weitere Erklärungen github.com/moment/moment-timezone/issues/324
ymz
4
+1. Stellen Sie sicher, dass Sie den Moment mit Datum verwenden, um den tz-Haken zu verwenden. momentjs.com/timezone/docs, um es mit node.js zu installieren, verwenden Sie diesen Befehl npm install moment-timezoneund benötigen Sie ihn dann wie folgtwindow.moment = require('moment-timezone');
Junior
2
Wird die Zeitzone vom Browser oder vom Gerät übernommen?
Blase
2
@bubble - Es stammt aus der Umgebung, in der der Code ausgeführt wird.
Matt Johnson-Pint
1
@Scaramouche - Das hängt nicht damit zusammen, was hier gefragt wird. Bitte verketten Sie nicht alte Kommentare, sondern stellen Sie eine neue Frage. (kurze Antwort - nein, Sie können immer noch nicht)
Matt Johnson-Pint
6

Alle aktuellen Antworten liefern die Offsetdifferenz zum aktuellen Zeitpunkt, nicht zu einem bestimmten Datum.

moment(date).utcOffset()Gibt den Zeitunterschied in Minuten zwischen der Browserzeit und UTC zum als Argument übergebenen Datum zurück (oder heute, wenn kein Datum übergeben wurde).

Hier ist eine Funktion zum Analysieren des korrekten Versatzes zum ausgewählten Datum:

function getUtcOffset(date) {
  return moment(date)
    .subtract(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}
tao
quelle
1
Die Funktion ist eigentlich utcOffset()nicht offsetUtc():)
Milkncookiez
2
@ Milkncookiez, ich habe die Antwort aktualisiert. Vielen Dank. Keine Ahnung, wie ich sie invertiert habe (es kann sein, dass ich in beide Richtungen arbeite oder in einer früheren Version geändert werde - die Wahrscheinlichkeit, dass ich etwas poste, das ich nicht getestet habe, liegt nahe null).
Tao
3

Verwenden Sie die Moment- Bibliothek auf ihrer Website -> https://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/

Ich stelle fest, dass sie auch ihre eigene Bibliothek auf ihrer Website verwenden, sodass Sie die Browserkonsole vor der Installation ausprobieren können

moment().tz(String);

The moment#tz mutator will change the time zone and update the offset.

moment("2013-11-18").tz("America/Toronto").format('Z'); // -05:00
moment("2013-11-18").tz("Europe/Berlin").format('Z');   // +01:00

This information is used consistently in other operations, like calculating the start of the day.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format();                     // 2013-11-18T11:55:00-05:00
m.startOf("day").format();      // 2013-11-18T00:00:00-05:00
m.tz("Europe/Berlin").format(); // 2013-11-18T06:00:00+01:00
m.startOf("day").format();      // 2013-11-18T00:00:00+01:00

Without an argument, moment#tz returns:

    the time zone name assigned to the moment instance or
    undefined if a time zone has not been set.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.tz();  // America/Toronto
var m = moment.tz("2013-11-18 11:55");
m.tz() === undefined;  // true
Philippe
quelle
1

Sie können Ihre gewünschte Zeit auch mit dem folgenden JS-Code ermitteln:

new Date(`${post.data.created_at} GMT+0200`)

In diesem Beispiel lagen meine empfangenen Daten in der Zeitzone GMT + 0200. Stattdessen kann es jede einzelne Zeitzone sein. Und die zurückgegebenen Daten sind das Datum in Ihrer Zeitzone. Ich hoffe, dies hilft jedem, Zeit zu sparen

David
quelle