Gibt es eine Standardmethode für einen Webserver, um die Zeitzone eines Benutzers innerhalb einer Webseite zu bestimmen?
Vielleicht aus einem HTTP-Header oder einem Teil der user-agent
Zeichenfolge?
html
browser
timezone
user-agent
timezone-offset
Kevin Dente
quelle
quelle
Antworten:
Die Methode
getTimezoneOffset()
subtrahiert Ihre Zeit von GMT und gibt die Anzahl der Minuten zurück. Wenn Sie also in GMT-8 leben, wird 480 zurückgegeben.Um dies in Stunden zu fassen, dividieren Sie durch 60. Beachten Sie auch, dass das Vorzeichen das Gegenteil von dem ist, was Sie benötigen - es berechnet den Versatz von GMT von Ihrer Zeitzone, nicht den Versatz Ihrer Zeitzone von GMT. Um dies zu beheben, multiplizieren Sie einfach mit -1.
Beachten Sie auch, dass w3school sagt:
quelle
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Die beliebteste (== Standard?) Methode zur Bestimmung der Zeitzone, die ich gesehen habe, besteht darin, einfach die Benutzer selbst zu fragen. Wenn für Ihre Website ein Abonnement erforderlich ist, kann dieses in den Profildaten der Benutzer gespeichert werden. Für anon Benutzer können die Daten als UTC oder GMT oder ähnliches angezeigt werden.
Ich versuche nicht, ein kluger Kerl zu sein. Es ist nur so, dass manchmal einige Probleme außerhalb eines Programmierkontexts feinere Lösungen haben.
quelle
Bisher gibt es keine HTTP-Header, die die Zeitzone des Clients melden, obwohl vorgeschlagen wurde, sie in die HTTP-Spezifikation aufzunehmen.
Wenn ich es wäre, würde ich wahrscheinlich versuchen, die Zeitzone mit clientseitigem JavaScript abzurufen und sie dann mit Ajax oder etwas anderem an den Server zu senden.
quelle
JavaScript ist der einfachste Weg, um die Ortszeit des Clients abzurufen. Ich würde vorschlagen, eine XMLHttpRequest zu verwenden, um die Ortszeit zurückzusenden. Wenn dies fehlschlägt, greifen Sie auf die Zeitzone zurück, die anhand ihrer IP-Adresse ermittelt wurde.
In Bezug auf die Geolokalisierung habe ich MaxMind GeoIP in mehreren Projekten verwendet und es funktioniert gut, obwohl ich nicht sicher bin, ob sie Zeitzonendaten liefern. Es ist ein Service, für den Sie bezahlen und der monatliche Aktualisierungen Ihrer Datenbank bereitstellt. Sie bieten Wrapper in mehreren Web-Sprachen.
quelle
Verstehen Sie zunächst, dass die Zeitzonenerkennung in JavaScript nicht perfekt ist. Sie können die lokal bekommen Zeitzonen - Offset für ein bestimmtes Datum und die Uhrzeit mit
getTimezoneOffset
auf einer Instanz desDate
Objekts, aber das ist nicht ganz das gleiche wie eine Voll IANA Zeitzone wieAmerica/Los_Angeles
.Es gibt jedoch einige Optionen, die funktionieren können:
Das Ergebnis ist eine Zeichenfolge, die die IANA-Zeitzoneneinstellung des Computers enthält, auf dem der Code ausgeführt wird.
Unterstützte Umgebungen sind in der Intl-Kompatibilitätstabelle aufgeführt . Erweitern Sie den
DateTimeFormat
Abschnitt und sehen Sie sich die genannte Funktion anresolvedOptions().timeZone defaults to the host environment
.Einige Bibliotheken wie Luxon verwenden diese API, um die Zeitzone durch Funktionen wie zu bestimmen
luxon.Settings.defaultZoneName
.Intl
API, wenn sie verfügbar ist, und wenn sie nicht verfügbar ist, fragen sie diegetTimezoneOffset
Funktion desDate
Objekts zu verschiedenen Zeitpunkten ab und verwenden die Ergebnisse, um eine geeignete Zeitzone aus einem internen Datensatz auszuwählen.Sowohl jsTimezoneDetect als auch moment-timezone verfügen über diese Funktionalität.
In beiden Fällen kann das Ergebnis nur als Vermutung betrachtet werden. Die Vermutung mag in vielen Fällen richtig sein, aber nicht in allen.
Darüber hinaus müssen diese Bibliotheken regelmäßig aktualisiert werden, um der Tatsache entgegenzuwirken, dass viele ältere JavaScript-Implementierungen nur die aktuelle Sommerzeitregel für ihre lokale Zeitzone kennen. Mehr dazu hier.
Letztendlich ist es ein besserer Ansatz, Ihren Benutzer tatsächlich nach seiner Zeitzone zu fragen. Geben Sie eine Einstellung an, die sie ändern können. Sie können eine der oben genannten Optionen verwenden, um eine Standardeinstellung auszuwählen , aber machen Sie es nicht unmöglich, in Ihrer App davon abzuweichen.
Es gibt auch einen völlig anderen Ansatz, sich überhaupt nicht auf die Zeitzoneneinstellung des Computers des Benutzers zu verlassen. Wenn Sie stattdessen Längen- und Breitengradkoordinaten erfassen können, können Sie diese mit einer dieser Methoden in eine Zeitzone auflösen . Dies funktioniert gut auf mobilen Geräten.
quelle
Hier ist eine robuste JavaScript-Lösung, um die Zeitzone zu bestimmen, in der sich der Browser befindet.
https://bitbucket.org/pellepim/jstimezonedetect
Anhang 1: Jetzt befindet sich dieses Projekt auf GitHub: https://github.com/pellepim/jstimezonedetect
quelle
Hier ist ein vollständigerer Weg.
Ein Auszug ist unten:
TZ und DST von JS erhalten (über Way Back Machine)
quelle
Africa/Johannesburg
oderEurope/Istanbul
. Siehe das Zeitzonen-Tag-Wiki .Mit dem Ansatz von Unkwntech habe ich eine Funktion mit jQuery und PHP geschrieben. Dies ist getestet und funktioniert!
Auf der PHP-Seite, auf der Sie die Zeitzone als Variable haben möchten, befindet sich dieser Codeausschnitt irgendwo oben auf der Seite:
Dies liest die Sitzungsvariable "Zeit", die wir jetzt erstellen werden.
Auf derselben Seite müssen Sie im <head> zunächst jQuery einschließen:
Fügen Sie auch im <head> unterhalb der jQuery Folgendes ein:
Möglicherweise haben Sie es bemerkt oder nicht, aber Sie müssen die URL in Ihre tatsächliche Domain ändern.
Eine letzte Sache. Sie fragen sich wahrscheinlich, was zum Teufel timezone.php ist. Nun, es ist einfach so: (Erstellen Sie eine neue Datei namens timezone.php und zeigen Sie mit der obigen URL darauf)
Wenn dies korrekt funktioniert, wird zuerst die Seite geladen, das JavaScript ausgeführt und die Seite neu geladen. Sie können dann die Variable $ timezone lesen und zu Ihrem Vergnügen verwenden! Es gibt den aktuellen UTC / GMT-Zeitzonenversatz (GMT -7) oder die Zeitzone zurück, in der Sie sich befinden.
quelle
Übermitteln des Zeitzonenversatzes als HTTP-Header bei AJAX-Anforderungen mit jQuery
Sie können auch etwas ähnliches tun , um die tatsächlichen Zeitzonennamen , indem Sie erhalten
moment.tz.guess();
von http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/quelle
Ich habe hier noch keine detaillierte Antwort gesehen, die die Zeitzone erhält. Sie sollten nicht nach IP-Adresse geocodieren oder PHP (lol) verwenden oder falsch von einem Offset raten müssen.
Erstens ist eine Zeitzone nicht nur ein Versatz von GMT. Es ist ein Gebiet, in dem die Zeitregeln durch lokale Standards festgelegt werden. Einige Länder haben Sommerzeit und schalten die Sommerzeit zu unterschiedlichen Zeiten ein. Normalerweise ist es wichtig, die tatsächliche Zone zu ermitteln, nicht nur den aktuellen Versatz.
Wenn Sie diese Zeitzone speichern möchten, beispielsweise in den Benutzereinstellungen, möchten Sie die Zone und nicht nur den Versatz. Für Echtzeitkonvertierungen spielt es keine Rolle.
Um die Zeitzone mit Javascript zu erhalten, können Sie Folgendes verwenden:
Ich fand es jedoch einfacher, einfach dieses robuste Plugin zu verwenden, das die Olsen-formatierte Zeitzone zurückgibt:
https://github.com/scottwater/jquery.detect_timezone
quelle
Mit der PHP-
date
Funktion erhalten Sie das Datum und die Uhrzeit des Servers, auf dem sich die Site befindet. Die einzige Möglichkeit, die Benutzerzeit zu ermitteln, ist die Verwendung von JavaScript.Ich empfehle Ihnen jedoch, wenn für Ihre Website eine Registrierung erforderlich ist, der Benutzer am besten zu fragen, ob eine Registrierung als Pflichtfeld erforderlich ist. Sie können verschiedene Zeitzonen auf der Registerseite auflisten und in der Datenbank speichern. Wenn sich der Benutzer danach bei der Site anmeldet, können Sie die Standardzeitzone für diese Sitzung gemäß der vom Benutzer ausgewählten Zeitzone festlegen.
Mit der PHP-Funktion können Sie eine bestimmte Zeitzone einstellen
date_default_timezone_set
. Dadurch wird die angegebene Zeitzone für Benutzer festgelegt.Grundsätzlich geht die Zeitzone der Benutzer auf die Clientseite, daher müssen wir dafür JavaScript verwenden.
Unten finden Sie das Skript zum Abrufen der Zeitzone von Benutzern mithilfe von PHP und JavaScript.
Aus meiner Sicht ist es jedoch besser, die Benutzer zu fragen, ob eine Registrierung in Ihrem Projekt obligatorisch ist.
quelle
Verwenden Sie die IP-Adresse nicht, um den Standort (und damit die Zeitzone) endgültig zu bestimmen. Dies liegt daran, dass IP-Adressen bei NAT, Proxys (die immer beliebter werden) und VPNs nicht unbedingt den tatsächlichen Standort des Benutzers realistisch widerspiegeln, sondern den Standort, an dem sich die IP-Adresse befindet Server, die diese Protokolle implementieren, befinden sich.
Ähnlich wie US-Vorwahlen angesichts der Beliebtheit der Nummernübertragbarkeit für die Lokalisierung eines Telefonbenutzers nicht mehr nützlich sind.
Die IP-Adresse und andere oben gezeigte Techniken sind nützlich, um einen Standard vorzuschlagen , den der Benutzer anpassen / korrigieren kann.
quelle
JavaScript:
Geben Sie für diese Funktion einfach Ihre Zeiten im Unix-Zeitstempelformat an. JavaScript kennt bereits die Zeitzone des Benutzers.
So was:
PHP:
Dadurch werden die Zeiten immer korrekt angezeigt, basierend auf der Zeitzone, die die Person auf ihrer Computeruhr eingestellt hat. Es ist nicht nötig, irgendjemanden etwas zu fragen und es an Orten aufzubewahren, Gott sei Dank!
quelle
Einfach, verwenden Sie einfach die JavaScript-
getTimezoneOffset
Funktion wie folgt:quelle
Die Magie scheint alles zu sein
Das ist cool, das wusste ich nicht. Funktioniert es in Internet Explorer usw.? Von dort aus sollten Sie in der Lage sein, JavaScript für Ajax zu verwenden, Cookies zu setzen, was auch immer. Ich würde wahrscheinlich selbst die Cookie-Route gehen.
Sie müssen dem Benutzer jedoch erlauben, es zu ändern. Wir haben vor einiger Zeit versucht, Geolocation (über maxmind) zu verwenden, um dies zu tun, und es war ziemlich oft falsch - genug, um es nicht wert zu machen, also ließen wir den Benutzer es einfach in seinem Profil festlegen und zeigten Benutzern, die dies tun habe ihre noch nicht eingestellt.
quelle
In diesem Artikel (mit Quellcode) wird erläutert, wie die lokalisierte Zeit in einer ASP.NET-Anwendung (VB.NET, C #) ermittelt und verwendet wird:
Es ist Zeit
Kurz gesagt, der beschriebene Ansatz basiert auf der JavaScript-
getTimezoneOffset
Funktion, die den Wert zurückgibt, der im Sitzungscookie gespeichert und von CodeBehind zum Anpassen der Zeitwerte zwischen GMT und Ortszeit verwendet wird. Das Schöne ist, dass der Benutzer die Zeitzone nicht angeben muss (der Code erledigt dies automatisch). Es ist mehr involviert (aus diesem Grund verlinke ich auf den Artikel), aber der bereitgestellte Code macht die Verwendung wirklich einfach. Ich vermute, dass Sie die Logik in PHP und andere Sprachen konvertieren können (solange Sie ASP.NET verstehen).quelle
Wenn Sie OpenID zur Authentifizierung verwenden, löst die Simple Registration Extension das Problem für authentifizierte Benutzer (Sie müssen von tz in numerisch konvertieren).
Eine andere Möglichkeit wäre, die Zeitzone aus den Länderpräferenzen des Benutzeragenten abzuleiten. Dies ist eine etwas grobe Methode (funktioniert nicht für en-US), macht aber eine gute Annäherung.
quelle
Mit JavaScript und PHP ist das ganz einfach:
Obwohl der Benutzer mit seiner internen Uhr und / oder Zeitzone herumspielen kann, bleibt der beste Weg, den ich bisher gefunden habe, um den Offset zu erhalten
new Date().getTimezoneOffset();
. Es ist nicht invasiv, verursacht keine Kopfschmerzen und macht es überflüssig, sich auf Dritte zu verlassen.Angenommen, ich habe eine Tabelle,
users
die ein Felddate_created int(13)
zum Speichern von Unix-Zeitstempeln enthält.Unter der Annahme einen Client
creates a new account
, Daten empfingen durchpost
, und ich brauche , uminsert/update
diedate_created column
mit dem Unix - Zeitstempel des Clients, nicht dem Server.Da das timezoneOffset zum Zeitpunkt des Einfügens / Aktualisierens benötigt wird, wird es beim Senden des Formulars als zusätzliches $ _POST-Element übergeben, sodass es nicht mehr in Sitzungen und / oder Cookies gespeichert werden muss und auch keine zusätzlichen Servertreffer erforderlich sind.
Angenommen, der Server empfängt
tzo
als$_POST['tzo']
;Einfügen / aktualisieren
date_created=$user_timestamp
.Beim Abrufen von date_created können Sie den Zeitstempel folgendermaßen konvertieren:
Dieses Beispiel entspricht möglicherweise den Anforderungen beim Einfügen eines
first
Zeitstempels. Wenn es sich um einen zusätzlichen Zeitstempel oder eine zusätzliche Tabelle handelt, sollten Sie den tzo-Wert zur späteren Bezugnahme in die Benutzertabelle einfügen oder festlegen als Sitzung oder als Cookie.PS ABER was ist, wenn der Benutzer reist und die Zeitzonen wechselt? Loggt sich bei GMT + 4 ein, fährt schnell zu GMT-1 und meldet sich erneut an. Der letzte Login würde in der Zukunft sein.
Ich denke ... wir denken zu viel.
quelle
Sie können dies auf dem Client mit der Zeitzone tun und den Wert an den Server senden. Beispielnutzung:
quelle
Das Abrufen eines gültigen Zeitzonennamens für die TZ-Datenbank in PHP erfolgt in zwei Schritten:
Mit JavaScript erhalten Sie einen Zeitzonenversatz in Minuten
getTimezoneOffset
. Dieser Offset ist positiv, wenn die lokale Zeitzone hinter UTC liegt, und negativ, wenn sie vor uns liegt. Sie müssen dem Offset also ein entgegengesetztes Vorzeichen hinzufügen.Übergeben Sie diesen Offset an PHP.
In PHP konvertieren Sie diesen Offset in einen gültigen Zeitzonennamen mit der Funktion timezone_name_from_abbr .
Ich habe einen Blog-Beitrag darüber geschrieben: So erkennen Sie die Benutzerzeitzone in PHP . Es enthält auch eine Demo.
quelle
Intl.DateTimeFormat().resolvedOptions().timeZone
und an den Webserver zu senden. Ref: stackoverflow.com/questions/9772955/…Ein einfacher Weg, dies zu tun, ist die Verwendung von:
quelle
Eine mögliche Option ist die Verwendung des
Date
Header-Felds, das in RFC 7231 definiert ist und die Zeitzone enthalten soll. Natürlich kann nicht garantiert werden, dass der Wert wirklich die Zeitzone des Kunden ist, aber es kann ein bequemer Ausgangspunkt sein.quelle
Hier ist, wie ich es mache. Dadurch wird die PHP-Standardzeitzone auf die lokale Zeitzone des Benutzers festgelegt. Fügen Sie einfach oben auf all Ihren Seiten Folgendes ein:
quelle
Versuchen Sie diesen PHP-Code:
quelle