Wie kann ich die Zeitzoneninformationen des Besuchers erfassen?
Ich brauche beides:
- die Zeitzone (z. B. Europa/London)
- und die Abweichung von UTC oder GMT (z. B. UTC+01)
Wie kann ich die Zeitzoneninformationen des Besuchers erfassen?
Ich brauche beides:
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)
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 keinetimeZone
Eigenschaft war in dem Optionsobjekt angegeben, das demIntl.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 keinetimeZone
Eigenschaft wurde in dem Optionsobjekt bereitgestellt, das derIntl.DateTimeFormat
Konstrukteur. In der vorherigen Version wurde dertimeZone
Eigenschaft in diesem Fall undefiniert.
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).
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.
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());
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}`
}
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 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.