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)

1voto

Moysés Lacerda Punkte 27

Auf der new Date( ) können Sie den Offset erhalten, um den Namen der Zeitzone zu erhalten, können Sie dies tun:

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

erhalten Sie den Wert zwischen () am Ende des Datums, das ist der Name der Zeitzone.

1voto

Abhish Abraham Punkte 56

Das wäre meine Lösung:

    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];

    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;

    console.log(`${timeZone}, ${offsetHours}hrs`);

1voto

melody_florum Punkte 329

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

1voto

brauliobo Punkte 5105

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 )

0voto

Kumal Pereira Punkte 69

Verwenden Sie dies, um OffSet in positiv zu konvertieren:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);

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