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:
Dies ist vielleicht nicht die eleganteste Lösung, aber die vielseitigste.
Dabei wird die timeZoneName
Eigenschaft von Intl.DateTimeFormat
function getTimeZone(zoneName = "long") {
// set up formatter
let formatter = new Intl.DateTimeFormat(undefined, {
timeZoneName: zoneName
});
// run formatter on current date
return formatter.formatToParts(Date.now())
// extract the actual value from the formatter, only reliable way i can find to do this
.find(formatted => formatted.type === "timeZoneName")['value'];
}
// console.log every type
for (const zoneName of ['short', 'long', 'shortOffset', 'longOffset', 'shortGeneric', 'longGeneric']) {
console.log(`${zoneName}: ${getTimeZone(zoneName)}`)
}
/*
short: CDT
long: Central Daylight Time
shortOffset: GMT-5
longOffset: GMT-05:00
shortGeneric: CT
longGeneric: Central Time
*/
Damit erhält man nicht nur die formatierte GMT-Offset-Zeit (z. B. GMT-5), sondern auch den umgangssprachlichen Namen der Zeitzone (z. B. Central Daylight Time)
Das Einzige, was diese Methode nicht tut, ist, die IANA-Zeitzone abzurufen. Ich empfehle die beste Antwort dafür.
Soweit mir bekannt ist, DateTimeFormat
hat keine Möglichkeit, benutzerdefinierte Formatierungen vorzunehmen, daher die Verwendung von formatToParts
was der einzige zuverlässige Weg zu sein scheint, um die juste die Zeitzone.
Es ist wichtig zu beachten, dass nur short
y long
sind offiziell definiert in der aktuelle ECMAscript-Spezifikationen , die anderen 4 Optionen sind Teil von ein Vorschlag das ist nur etwas Standard Allerdings fehlt er zum Zeitpunkt des Schreibens dieses Artikels auf Safari. es ist in Arbeit
Als Alternative zu new Date().getTimezoneOffset()
y moment().format('zz')
können Sie auch verwenden momentjs :
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone ist auch ziemlich fehlerhaft und wird nicht gewartet ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
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.