Gibt es eine zuverlässige Möglichkeit, eine Zeitzone vom Client-Browser abzurufen? Ich habe die folgenden Links gesehen, möchte aber eine robustere Lösung.
Gibt es eine zuverlässige Möglichkeit, eine Zeitzone vom Client-Browser abzurufen? Ich habe die folgenden Links gesehen, möchte aber eine robustere Lösung.
Antworten:
Schauen Sie sich diese Repository- Seite an, es ist hilfreich
Laden Sie jstz.min.js herunter und fügen Sie Ihrer HTML-Seite eine Funktion hinzu
<script language="javascript">
function getTimezoneName() {
timezone = jstz.determine()
return timezone.name();
}
</script>
und rufen Sie diese Funktion von Ihrem Display-Tag aus auf
Intl.DateTimeFormat().resolvedOptions().timeZone
(kein IE11) verwenden, wie von Wallace vorgeschlagen.
Ein halbes Jahrzehnt später haben wir einen eingebauten Weg dafür! Für moderne Browser würde ich verwenden:
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);
Dies gibt eine IANA-Zeitzonenzeichenfolge zurück, jedoch nicht den Offset . Weitere Informationen finden Sie in der MDN-Referenz .
Kompatibilitätstabelle - Stand März 2019: Funktioniert für 90% der weltweit verwendeten Browser. Funktioniert nicht mit Internet Explorer .
Intl.DateTimeFormat().resolvedOptions().timeZone
->undefined
Intl.DateTimeFormat().resolvedOptions().timeZone
wird den erwarteten Wert ab Firefox 52 zurückgeben: kangax.github.io/compat-table/esintl/…
Wenn Menschen nach "Zeitzonen" suchen, reicht oft nur "UTC-Offset" aus. Ihr Server befindet sich beispielsweise in UTC + 5 und sie möchten wissen, dass ihr Client in UTC-8 ausgeführt wird .
In einfachem altem Javascript (new Date()).getTimezoneOffset()/60
wird die aktuelle Anzahl der von UTC versetzten Stunden zurückgegeben.
Es ist erwähnenswert, dass im Zeichen des getTimezoneOffset()
Rückgabewerts (aus MDN-Dokumenten) ein mögliches "Gotcha" angegeben ist :
Der Zeitzonenversatz ist die Differenz in Minuten zwischen UTC und Ortszeit. Beachten Sie, dass dies bedeutet, dass der Offset positiv ist, wenn die lokale Zeitzone hinter UTC liegt, und negativ, wenn sie voraus ist. Für die Zeitzone UTC + 10: 00 (australische Ost-Standardzeit, Wladiwostok-Zeit, Chamorro-Standardzeit) werden beispielsweise -600 zurückgegeben.
Ich empfehle jedoch, die Datei day.js für zeit- / datumsbezogenen Javascript-Code zu verwenden. In diesem Fall können Sie einen nach ISO 8601 formatierten UTC-Offset erhalten, indem Sie Folgendes ausführen:
> dayjs().format("Z")
"-08:00"
Es ist wahrscheinlich zu erwähnen, dass der Kunde diese Informationen leicht fälschen kann.
(Hinweis: Diese Antwort empfahl ursprünglich https://momentjs.com/ , aber dayjs ist eine modernere, kleinere Alternative.)
Im Moment ist die beste Wette wahrscheinlich jstz, wie in der Antwort von mbayloon vorgeschlagen .
Der Vollständigkeit halber sollte erwähnt werden, dass es einen Standard auf dem Weg gibt: Intl . Sie können dies bereits in Chrome sehen:
> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
(Dies entspricht nicht dem Standard, was ein weiterer Grund ist, bei der Bibliothek zu bleiben.)
Intl
sollen undefined
für die timeZone
Eigenschaft zurückgegeben werden, wenn Sie beim Erstellen der nicht manuell eine Zeitzone angegeben haben DateTimeFormat
. Chrome weicht vom Standard ab, indem stattdessen die Zeitzone des Systems zurückgegeben wird. Das ist es, was Johannes 'Antwort ausnutzt, aber auch, warum er sagte, "folgt nicht wirklich dem Standard".
Sie können die Zeitzone verwenden, um die Zeitzone zu erraten:
> moment.tz.guess()
"America/Asuncion"
Hier ist eine jsfiddle
Es enthält die Abkürzung für die aktuelle Benutzerzeitzone.
Hier ist das Codebeispiel
var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));
May 22 2015 03:45 PM CDT
ich es verwendet habe console.log(moment(now).format('MMM DD YYYY hh:mm A') + ' ' + moment.tz.zone(tz.name()).abbr(now.getTime()));
Ich habe einen ähnlichen Ansatz wie Josh Fraser verwendet , der den Browser-Zeitversatz von UTC bestimmt und feststellt, ob die Sommerzeit erkannt wird oder nicht (aber etwas vereinfacht aus seinem Code):
var ClientTZ = {
UTCoffset: 0, // Browser time offset from UTC in minutes
UTCoffsetT: '+0000S', // Browser time offset from UTC in '±hhmmD' form
hasDST: false, // Browser time observes DST
// Determine browser's timezone and DST
getBrowserTZ: function () {
var self = ClientTZ;
// Determine UTC time offset
var now = new Date();
var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0); // Jan
var diff1 = -date1.getTimezoneOffset();
self.UTCoffset = diff1;
// Determine DST use
var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0); // Jun
var diff2 = -date2.getTimezoneOffset();
if (diff1 != diff2) {
self.hasDST = true;
if (diff1 - diff2 >= 0)
self.UTCoffset = diff2; // East of GMT
}
// Convert UTC offset to ±hhmmD form
diff2 = (diff1 < 0 ? -diff1 : diff1) / 60;
var hr = Math.floor(diff2);
var min = diff2 - hr;
diff2 = hr * 100 + min * 60;
self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S');
return self.UTCoffset;
}
};
// Onload
ClientTZ.getBrowserTZ();
Beim Laden wird die ClientTZ.getBrowserTZ()
Funktion ausgeführt, die Folgendes festlegt:
ClientTZ.UTCoffset
zum Browser-Zeitversatz von UTC in Minuten (z. B. beträgt CST –360 Minuten, was –6,0 Stunden von UTC entspricht);ClientTZ.UTCoffsetT
auf den Versatz in der Form '±hhmmD'
(z. B. '-0600D'
), wobei das Suffix D
für DST und S
für Standard (Nicht-DST) steht;ClientTZ.hasDST
(zu wahr oder falsch).Das ClientTZ.UTCoffset
wird in Minuten statt in Stunden angegeben, da einige Zeitzonen gebrochene stündliche Offsets haben (z. B. +0415).
Die Absicht dahinter ClientTZ.UTCoffsetT
ist, es als Schlüssel für eine Tabelle von Zeitzonen (hier nicht bereitgestellt) zu verwenden, z. B. für eine Dropdown- <select>
Liste.
7-1
für Juli anstelle von Juni verwenden. Ich bin mir nicht sicher, ob es wirklich einen Unterschied macht, da ich bezweifle, dass es regionale Sommerzeitprogramme gibt, die den Juni nicht einschließen.
Nein, es gibt keinen einzigen zuverlässigen Weg und es wird niemals einen geben. Haben Sie wirklich gedacht, Sie könnten dem Kunden vertrauen?