1020 Stimmen

Abrufen der Zeitzone des Clients (und des Offsets) in JavaScript

Wie kann ich die Zeitzoneninformationen des Besuchers erfassen?

Ich brauche beides:

  1. die Zeitzone (z. B. Europa/London)
  2. und die Abweichung von UTC oder GMT (z. B. UTC+01)

1218voto

Pawel Wodzicki Punkte 16079

Die Verwendung eines Offsets zur Berechnung der Zeitzone ist ein falscher Ansatz, der immer zu Problemen führen wird. Zeitzonen und Sommerzeitregeln können sich im Laufe eines Jahres mehrmals ändern, und es ist schwierig, mit den Änderungen Schritt zu halten.

Um das System zu erhalten IANA-Zeitzone in JavaScript, sollten Sie

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

Ab April 2022 wird diese funktioniert in 93,5 % der weltweit verwendeten Browser .

Alte Kompatibilitätsinformationen

ecma-402/1.0 besagt, dass timeZone kann undefiniert sein, wenn sie dem Konstruktor nicht übergeben wird. Im zukünftigen Entwurf (3.0) wurde dieses Problem jedoch behoben, indem auf die Standardzeitzone des Systems umgestellt wurde.

In dieser Version der ECMAScript Internationalization API ist die timeZone Eigenschaft bleibt undefiniert, wenn keine timeZone Eigenschaft war in dem Optionsobjekt angegeben, das dem Intl.DateTimeFormat Konstrukteur . Anwendungen sollten sich jedoch nicht darauf verlassen, da zukünftige Versionen möglicherweise einen String-Wert zurückgeben, der die aktuelle Zeitzone der Host-Umgebung Zeitzone der Host-Umgebung identifizieren.

in ecma-402/3.0, die sich noch im Entwurfsstadium befindet, geändert in

In dieser Version der ECMAScript 2015 Internationalization API ist die timeZone ist der Name der Standardzeitzone, wenn keine timeZone Eigenschaft wurde in dem Optionsobjekt bereitgestellt, das der Intl.DateTimeFormat Konstrukteur. In der vorherigen Version wurde der timeZone Eigenschaft in diesem Fall undefiniert.

768voto

NickFitz Punkte 33461

Verwendung von getTimezoneOffset()

Sie können die Zeitzone abrufen Versatz in Minuten so:

var offset = new Date().getTimezoneOffset();
console.log(offset);
// if offset equals -60 then the time zone offset is UTC+01

Die Zeitzonenverschiebung ist die Differenz in Minuten zwischen UTC und Ortszeit. Das bedeutet, dass der Versatz positiv ist, wenn die lokale Zeitzone hinter der UTC liegt, und negativ, wenn sie vor der UTC liegt. Wenn Ihre Zeitzone beispielsweise UTC+10 (australische Oststandardzeit) ist, wird -600 zurückgegeben. Die Sommerzeit verhindert, dass dieser Wert auch für ein bestimmtes Gebietsschema konstant ist.

Beachten Sie, dass nicht alle Zeitzonen um ganze Stunden versetzt sind: Neufundland beispielsweise ist UTC minus 3h 30m (ohne Berücksichtigung der Sommerzeit).

Bitte beachten Sie auch, dass Sie damit nur den Zeitzonen-Offset (z. B. UTC+01) erhalten, nicht aber die Zeitzone (z. B. Europa/London).

160voto

Marquez Punkte 5582

Edit 3-19-2022 - WARNUNG: Ich empfehle diesen Ansatz nicht mehr, da er Probleme mit mehreren Browsern und Sprachumgebungen hat.

Mir ist klar, dass diese Antwort ein wenig vom Thema abweicht, aber ich kann mir vorstellen, dass viele von uns, die nach einer Antwort suchen, auch die Zeitzone für die Anzeige formatieren und vielleicht auch die Abkürzung der Zone erhalten möchten. Also hier geht's los...

Wenn Sie möchten, dass die Client-Zeitzone schön formatiert wird, können Sie sich auf die JavaScript-Methode Date.toString verlassen und dies tun:

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

So erhalten Sie z. B. "GMT-0400 (EST)", einschließlich der Minuten der Zeitzone, falls zutreffend.

Alternativ dazu können Sie mit Regex jeden gewünschten Teil extrahieren:

Für "GMT-0400 (EDT)" :

new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]

Für "GMT-0400" :

new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]

Nur für "EDT" :

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

Nur für "-0400":

new Date().toString().match(/([-\+][0-9]+)\s/)[1]

Date.toString-Referenz: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString

EDIT 10/6/2020 - Die obige Lösung funktioniert möglicherweise nicht in allen Browsern und Sprachumgebungen. Wenn möglich in Ihrem Szenario, würde ich empfehlen, eine Javascript-Bibliothek wie Datum-fns, luxon oder dayjs, die Zeitzonen-Unterstützung bieten zu verwenden.

87voto

Mr_Green Punkte 38875

Ich habe in meinem Projekt eine Funktion geschrieben, die die Zeitzone in hh:mm Format. Ich hoffe, dies kann jemandem helfen:

function getTimeZone() {
    var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
    return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}

// Outputs: +5:00

function getTimeZone() {
  var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
  return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}

// See output
document.write(getTimeZone());

Arbeitsfiedel

Code mit Kommentaren

/**
 * Get client side timezone.
 *
 * @returns {(+|-)HH:mm} - Where `HH` is 2 digits hours and `mm` 2 digits minutes.
 * @example
 * // From Indian/Reunion with UTC+4
 * // '+04:00'
 * getTimeZone()
 */
const getTimeZone = () => {
  const timezoneOffset = new Date().getTimezoneOffset()
  const offset = Math.abs(timezoneOffset)
  const offsetOperator = timezoneOffset < 0 ? '+' : '-'
  const offsetHours = (offset / 60).toString().padStart(2, '0')
  const offsetMinutes = (offset % 60).toString().padStart(2, '0')

  return `${offsetOperator}${offsetHours}:${offsetMinutes}`
}

84voto

cryo Punkte 13701

Es wurde bereits beantwortet, wie man den Offset in Minuten als Ganzzahl erhält, aber falls jemand den lokalen GMT-Offset als String haben möchte, z.B. "+1130" :

function pad(number, length){
    var str = "" + number
    while (str.length < length) {
        str = '0'+str
    }
    return str
}

var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
          pad(parseInt(Math.abs(offset/60)), 2)+
          pad(Math.abs(offset%60), 2))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X