Wie kann ich die Zeitzoneninformationen des Besuchers erfassen? Ich brauche die Zeitzone sowie die GMT-Offsetstunden.
Wie kann ich die Zeitzoneninformationen des Besuchers erfassen? Ich brauche die Zeitzone sowie die GMT-Offsetstunden.
Antworten:
var offset = new Date().getTimezoneOffset();
console.log(offset);
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. Wenn Ihre Zeitzone beispielsweise UTC + 10 (Australian Eastern Standard Time) ist, wird -600 zurückgegeben. Die Sommerzeit verhindert, dass dieser Wert auch für ein bestimmtes Gebietsschema konstant bleibt
Beachten Sie, dass nicht alle Zeitzonen um ganze Stunden versetzt sind: Neufundland ist beispielsweise UTC minus 3h 30m (ohne Sommerzeit).
getTimezoneOffset
Ungenauigkeit in Kraft? Der Artikel, auf den Sie sich beziehen, ist vom Juni 2007 und enthält keine Details darüber, wie die Funktion ungenau ist. Tatsächlich jsTimezoneDetect
verwendet getTimezoneOffset
sich die Bibliothek, auf die Sie hingewiesen haben, selbst.
var hrs = -(new Date().getTimezoneOffset() / 60)
um in Stunden normalerweise versetzt zu werden
timezone
! =utc offset
Die Verwendung eines Versatzes zur Berechnung der Zeitzone ist ein falscher Ansatz, und Sie werden immer auf Probleme stoßen. Zeitzonen und Sommerzeitregeln können sich im Laufe eines Jahres mehrmals ändern, und es ist schwierig, mit den Änderungen Schritt zu halten.
Um die IANA-Zeitzone des Systems in JavaScript abzurufen , sollten Sie verwenden
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 sagt, dass timeZone
dies undefiniert sein kann, wenn es dem Konstruktor nicht zur Verfügung gestellt wird. Der zukünftige Entwurf (3.0) behebt dieses Problem jedoch, indem er zur Standardzeitzone des Systems wechselt.
In dieser Version der ECMAScript Internationalization API
timeZone
bleibt die Eigenschaft undefiniert, wenntimeZone
in dem demIntl.DateTimeFormat
Konstruktor bereitgestellten Optionsobjekt keine Eigenschaft angegeben wurde . Anwendungen sollten sich jedoch nicht darauf verlassen, da zukünftige Versionen möglicherweise stattdessen einen String-Wert zurückgeben, der die aktuelle Zeitzone der Host-Umgebung angibt.
in ecma-402 / 3.0, das sich noch in einem Entwurf befindet, wurde es geändert
In dieser Version der ECMAScript 2015 Internationalization API ist die
timeZone
Eigenschaft der Name der Standardzeitzone, wenntimeZone
in dem demIntl.DateTimeFormat
Konstruktor bereitgestellten Optionsobjekt keine Eigenschaft angegeben wurde . In der vorherigen Version wurde dietimeZone
Eigenschaft in diesem Fall nicht definiert.
Mir ist klar, dass diese Antwort ein wenig vom Thema abweicht, aber ich stelle mir vor, dass viele von uns, die nach einer Antwort suchen, auch die Zeitzone für die Anzeige formatieren und möglicherweise auch die Zonenabkürzung erhalten möchten. Also los geht's ...
Wenn Sie möchten, dass die Client-Zeitzone gut formatiert ist, können Sie sich auf die JavaScript-Methode Date.toString verlassen und Folgendes tun:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Dies gibt Ihnen beispielsweise "GMT-0400 (EST)", einschließlich der Zeitzonenminuten, falls zutreffend.
Alternativ können Sie mit Regex jedes gewünschte 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]
Für nur "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Für nur "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Date.toString-Referenz: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?!
split
enthält: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
so ist das ErgebnisDaylight Time)
new Date().toString()
hängt vollständig von Ihren Ländereinstellungen ab. Es ist eine sehr schlechte Idee, zu erwarten, dass die Ergebnisse anderer Kunden Ihren ähneln.
Es wurde bereits beantwortet, wie man in Minuten als Ganzzahl versetzt wird, aber falls jemand den lokalen GMT-Versatz als Zeichenfolge haben möchte, z "+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))
pad(parseInt(Math.abs(offset/60)), 2)
, um es richtig zu machen. Andernfalls erhalten Sie möglicherweise +5.530 wie in meinem Fall. Ich bin mir nicht sicher, ob Matheboden usw. hier besser ist oder nicht. Aber das hier atleast gibt mir +0530 wie erwartet
Sie können verwenden:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Die Erkennung der Browser-Zeitzone ist ziemlich schwierig, da der Browser nur wenige Informationen bereitstellt.
Moment Timezone nutzt Date.getTimezoneOffset()
und Date.toString()
in wenigen Momenten des laufenden Jahres, um so viele Informationen wie möglich über die Browserumgebung zu sammeln. Anschließend werden diese Informationen mit allen geladenen Zeitzonendaten verglichen und die engste Übereinstimmung zurückgegeben. Bei Verbindungen wird die Zeitzone mit der bevölkerungsreichsten Stadt zurückgegeben.
console.log(moment.tz.guess()); // America/Chicago
Ich habe in meinem Projekt eine Funktion geschrieben, die die Zeitzone im hh:mm
Format zurückgibt . Ich hoffe das 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
Ein Einzeiler , der sowohl den Offset als auch die Zeitzone angibt , besteht darin, einfach toTimeString () für ein neues Date-Objekt aufzurufen . Von MDN:
Die
toTimeString()
Methode gibt den Zeitanteil eines Date-Objekts in lesbarer Form in amerikanischem Englisch zurück.
Der Haken ist, dass die Zeitzone nicht im Standard-IANA-Format vorliegt. Es ist etwas benutzerfreundlicher als das IANA- Format "Kontinent / Stadt" . Versuch es:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
In Kalifornien wird toTimeString()
derzeit zurückgegeben, Pacific Daylight Time
während die Intl-API zurückgegeben wird America/Los_Angeles
. In Kolumbien würde man bekommen Colombia Standard Time
, vs.America/Bogota
.
Beachten Sie, dass viele andere Antworten auf diese Frage versuchen, dieselben Informationen durch Aufrufen von Date.toString () zu erhalten. Dieser Ansatz ist nicht so zuverlässig, wie MDN erklärt :
Datumsinstanzen beziehen sich auf einen bestimmten Zeitpunkt. Wenn Sie toString () aufrufen, wird das Datum in lesbarer Form in amerikanischem Englisch zurückgegeben. [...] Manchmal ist es wünschenswert, eine Zeichenfolge des Zeitabschnitts zu erhalten; so etwas kann mit dem erreicht werden
toTimeString()
Methode erreicht werden.Das
toTimeString()
Verfahren ist besonders nützlich, da sich kompatible Engines, die ECMA-262 implementieren, in der ZeichenfolgetoString()
fürDate
Objekte unterscheiden können, da das Format implementierungsabhängig ist. Einfache String-Slicing-Ansätze führen möglicherweise nicht zu konsistenten Ergebnissen über mehrere Engines hinweg.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Mit moment.js :
moment().format('zz');
Z
undZZ
Mit momentjsfinden Sie die aktuelle Zeitzone als
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Mit dayjsfinden Sie die aktuelle Zeitzone als
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Beide APIs geben den UTC-Offset in Minuten zurück.
getTimezoneOffset()
.
Zeitzone in Stunden-
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Wenn Sie genau sein möchten, wie Sie im Kommentar erwähnt haben, sollten Sie Folgendes versuchen:
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Wenn Sie nur die Zeitzonenabkürzung "MST" oder "EST" benötigen:
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
ist nicht zuverlässig, und MDN erklärt, warum. Ich habe den entsprechenden Abschnitt aus den Dokumenten in meine Antwort eingefügt .
Sehen Sie, dieser resultierende Operator war der Zeitzone entgegengesetzt. Wenden Sie also eine mathematische Funktion an und validieren Sie die Zahl weniger oder mehr.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Es sollte sein floor
, nicht wahr?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Beispiel: Do 21.06.2018 18:12:50 GMT + 0530 (India Standard Time)
O / P: +0530
Date.toString()
ist nicht zuverlässig, und MDN erklärt, warum. Ich habe den entsprechenden Abschnitt aus den Dokumenten in meine Antwort eingefügt .
Versuche dies,
new Date().toString().split("GMT")[1].split(" (")[0]
Dieser Wert stammt vom Computer des Benutzers und kann jederzeit geändert werden. Ich denke, das spielt keine Rolle. Ich möchte nur einen ungefähren Wert abrufen und ihn dann auf meinem Server in GMT konvertieren.
Zum Beispiel bin ich aus Taiwan und es gibt "+8" für mich zurück.
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Ergebnis
+8
Auf der new Date(
) können Sie den Offset erhalten, um den Zeitzonennamen zu erhalten, den Sie tun können:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
Sie erhalten den Wert zwischen ()
am Ende des Datums, dh dem Namen der Zeitzone.
Date.toString()
ist nicht zuverlässig, und MDN erklärt, warum. Ich habe den entsprechenden Abschnitt aus den Dokumenten in meine Antwort eingefügt . Auch diese Antwort wurde bereits mindestens dreimal gegeben.
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`);
Alternativ zu new Date().getTimezoneOffset()
und moment().format('zz')
können Sie auch verwendenmomentjs::
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 nicht gewartet ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Verwenden Sie diese Option, um OffSet in Postive umzuwandeln:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Ich suchte nur nach der 3-Buchstaben-Zeichenfolge (wie "PDT") und versuchte Marquez 'Antwort, musste sie aber für die browserübergreifende Unterstützung ein wenig optimieren. Zum Glück ist die Saite das letzte mögliche Match :)
Folgendes habe ich in CoffeeScript getan:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Funktioniert in IE8, IE9, Safari 9, Firefox 44 und Chrome 48
Date.toString()
ist nicht zuverlässig, und MDN erklärt, warum. Ich habe den entsprechenden Abschnitt aus den Dokumenten in meine Antwort eingefügt .
Sie müssen nur moment.js und jstz.js einschließen
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
und danach
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
Sie können dies einfach versuchen. Sie erhalten die aktuelle Maschinenzeit zurück
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
Es würde angezeigt werden: "Fr 28 Dez 2018 10:15:23 GMT + 0100 (Mitteleuropäische Standardzeit) {}"