Bestimmen Sie die Zeitzone eines Benutzers

522

Gibt es eine Standardmethode für einen Webserver, um die Zeitzone eines Benutzers auf einer Webseite zu bestimmen? Vielleicht aus einem HTTP-Header oder einem Teil der User-Agent-Zeichenfolge?

    
Kevin Dente 01.08.2008, 00:42
quelle

25 Antworten

299
%Vor%

getTimezoneOffset() subtrahiert Ihre Zeit von GMT und gibt die Anzahl der Minuten zurück. Also, wenn Sie in GMT-8 leben, wird es 480 zurückgeben. Um dies in Stunden einzuteilen, teilen Sie durch 60. Beachten Sie auch, dass das Zeichen das Gegenteil von dem ist, was Sie brauchen - es berechnet GMT-Offset von Ihrer Zeitzone, nicht Ihre Zeitzone von GMT versetzt. Um dies zu beheben, einfach mit -1 multiplizieren.

Bearbeiten

Beachten Sie auch, dass w3school sagt:

  

Der zurückgegebene Wert ist keine Konstante, da er praktisch verwendet wird   Sommerzeit.

    
JD Isaacks 27.11.2009 17:52
quelle
173

Die beliebteste (== standard?) Methode zur Bestimmung der Zeitzone, die ich gesehen habe, ist einfach die Benutzer selbst zu fragen. Wenn Ihre Website ein Abonnement erfordert, könnte dies in den Benutzern gespeichert werden 'Profildaten. Für Anon-Benutzer könnten die Daten als UTC oder GMT oder ähnliches angezeigt werden.

Ich versuche nicht, ein kluger Kerl zu sein. Es ist nur so, dass manchmal Probleme außerhalb des Programmierkontexts feinere Lösungen haben.

    
Ishmaeel 03.08.2008 19:30
quelle
74

Es gibt 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 zu holen und dann mit Ajax oder so etwas auf den Server zu übertragen.

    
Mads Kristiansen 01.08.2008 12:19
quelle
46

Javascript ist der einfachste Weg, um die lokale Zeit des Kunden zu erhalten. Ich würde vorschlagen, ein XMLHttpRequest zu verwenden, um die lokale Zeit zurückzusenden, und wenn das fehlschlägt, fallen Sie zurück zu der Zeitzone, die auf ihrer IP-Adresse erkannt wird.

Was die Geolokalisierung betrifft, habe ich MaxMind GeoIP bei mehreren Projekten verwendet und es funktioniert gut, obwohl ich bin mir nicht sicher, ob sie Zeitzonendaten bereitstellen. Es ist ein Service, für den Sie bezahlen, und sie bieten monatliche Updates für Ihre Datenbank. Sie bieten Wrapper in mehreren Websprachen.

    
pix0r 01.08.2008 15:11
quelle
37

Hier ist eine robuste JavaScript-Lösung zur Bestimmung der Zeitzone, in der sich der Browser befindet.

%Vor%

Ссылка

    
Adam 06.08.2012 21:22
quelle
33

Hier ist ein vollständigerer Weg.

  1. Erhalte den Zeitzonen-Offset für den Benutzer
  2. Testen Sie einige Tage an DLS-Grenzen, um festzustellen, ob sie sich in einer Zone befinden das verwendet DLS.

Ausgenommen unten:

%Vor%

Getting TZ und DST von JS (über Way Back Machine)

    
Joseph Lust 30.03.2011 20:48
quelle
26

Unter Verwendung von Unkwwntechs Ansatz schrieb ich eine Funktion mit jQuery und PHP. Dies ist getestet und funktioniert!

Auf der PHP-Seite, auf der Sie die Zeitzone als Variable haben möchten, haben Sie diesen Codeschnipsel irgendwo oben auf der Seite:

%Vor%

Dies liest die Sitzungsvariable "time", die wir jetzt erstellen werden.

Auf der gleichen Seite, in der, müssen Sie zuerst jQuery:

einschließen %Vor%

Fügen Sie auch in der, unterhalb der jQuery, Folgendes ein:

%Vor%

Sie haben es vielleicht bemerkt oder nicht bemerkt, aber Sie müssen die URL in Ihre tatsächliche Domäne ändern.

Eine letzte Sache. Sie fragen sich wahrscheinlich, was zum Teufel timezone.php ist. Nun, es ist einfach das: (Erstellen Sie eine neue Datei namens timezone.php und zeigen Sie mit der obigen URL darauf)

%Vor%

Wenn dies richtig funktioniert, lädt es zuerst die Seite, führt das JavaScript aus und lädt die Seite neu. Sie können dann die Variable $ timezone lesen und zu Ihrem Vergnügen verwenden! Er gibt den aktuellen UTC / GMT-Zeitzonen-Offset (GMT -7) oder die Zeitzone zurück, in der Sie sich befinden.

    
Westy92 09.04.2011 19:16
quelle
18

Ich habe hier noch keine detaillierte Antwort gefunden, die die Zeitzone erreicht. Sie sollten nicht nach IP-Adresse geocodiert werden oder PHP (lol) verwenden oder falsch von einem Offset erraten.

Erstens ist eine Zeitzone nicht nur ein Offset von GMT. Es ist eine Landfläche, in der die Zeitregeln nach lokalen Standards festgelegt sind. Einige Länder haben Sommerzeit und schalten die Sommerzeit zu unterschiedlichen Zeiten ein. Es ist normalerweise wichtig, die tatsächliche Zone zu erhalten, nicht nur den aktuellen Offset.

Wenn Sie diese Zeitzone speichern möchten, z. B. in Benutzereinstellungen, möchten Sie die Zone und nicht nur den Offset. Für Echtzeit-Conversions spielt das keine Rolle.

Um die Zeitzone mit Javascript zu erreichen, können Sie folgendes verwenden:

%Vor%

Ich fand es jedoch einfacher, dieses robuste Plugin zu verwenden, das die Olsen-formatierte Zeitzone zurückgibt:

Ссылка

    
Keyo 30.08.2012 05:08
quelle
18

Senden Sie den Zeitzonen-Offset als HTTP-Header für AJAX-Anfragen mit jQuery

%Vor%

Sie können auch etwas ähnliches tun, um den Namen der tatsächlichen Zeitzone zu erhalten, indem Sie moment.tz.guess(); von Ссылка

    
philfreo 13.09.2012 02:05
quelle
17

Zuerst sollten Sie verstehen, dass die Zeitzonenerkennung in JavaScript nicht perfekt ist. Sie können den lokalen Zeitzonen-Offset für ein bestimmtes Datum und eine bestimmte Uhrzeit mit getTimezoneOffset für eine Instanz des Date -Objekts abrufen, aber das ist nicht ganz dasselbe wie ein vollständiges IANA-Zeitzone wie America/Los_Angeles .

Es gibt jedoch einige Optionen, die funktionieren können:

  • Die meisten modernen Browser unterstützen die IANA-Zeitzonen in ihrer Implementierung der ECMAScript-Internationalisierungs-API , so dass Sie das tun können das:

    %Vor%

    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 Abschnitt DateTimeFormat , und sehen Sie sich das Feature resolvedOptions().timeZone defaults to the host environment an.

  • Wenn Sie eine größere Anzahl von Umgebungen unterstützen müssen, z. B. ältere Webbrowser, können Sie eine Bibliothek verwenden, um eine ermittelte Schätzung in der Zeitzone zu erstellen. Sie arbeiten, indem sie zuerst die Intl API testen, wenn sie verfügbar ist, und wenn sie nicht verfügbar ist, befragen sie die Funktion getTimezoneOffset des Objekts Date für verschiedene Zeitpunkte und verwenden die Ergebnisse, um eine geeignete Zeitzone auszuwählen aus einem internen Datensatz.

    Sowohl jsTimezoneDetect als auch Moment-Zeitzone diese Funktionalität haben.

    %Vor%

    In beiden Fällen kann das Ergebnis nur als eine Annahme gedacht werden. Die Schätzung mag in vielen Fällen korrekt sein, aber nicht alle.

    Außerdem müssen diese Bibliotheken regelmäßig aktualisiert werden, um der Tatsache entgegenzuwirken, dass viele ältere JavaScript-Implementierungen nur die aktuelle Sommerzeit-Regel für ihre lokale Zeitzone kennen. Weitere Details hierzu finden Sie hier.

Letztendlich ist es besser, Ihren Benutzer 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 Standard Einstellung zu wählen, aber machen Sie es nicht unmöglich, von der in Ihrer App abzuweichen.

Es gibt auch den völlig anderen Ansatz von not , der sich auf die Zeitzoneneinstellung des Computers des Benutzers stützt. Wenn Sie Breiten- und Längenkoordinaten erfassen können, können Sie diese stattdessen mit einer dieser Methoden in eine Zeitzone auflösen. Dies funktioniert gut auf mobilen Geräten.

    
Matt Johnson 25.03.2014 03:47
quelle
16
  

Wer weiß, welche Dienste es gibt?   IP auf geografischen Standort abstimmen

Nun, Glück für Sie, dass Sie diese Antwort auf unserer eigenen stackoverflow-Website finden können: Wie bekomme ich das Land nach einer bestimmten IP?

Spoiler: Ссылка

    
sven 04.08.2008 11:11
quelle
16

Einfach, verwenden Sie einfach die JavaScript getTimezoneOffset -Funktion wie folgt:

%Vor%     
JoeyFur62 27.05.2012 17:25
quelle
16

Mit der PHP-Datumsfunktion erhalten Sie die Datumszeit des Servers, auf dem sich die Site befindet. Die einzige Möglichkeit, Benutzerzeit zu erhalten, ist die Verwendung von JavaScript.

Aber ich schlage vor, Sie, wenn Ihre Website Registrierung erforderlich haben, dann ist der beste Weg, Benutzer während der Registrierung als Pflichtfeld zu fragen. Sie können verschiedene Zeitzonen auf der Registerseite auflisten und in der Datenbank speichern. Wenn sich der Benutzer anschließend an der Site anmeldet, können Sie die Standardzeitzone für diese Sitzung gemäß der ausgewählten Zeitzone des Benutzers festlegen. Sie können eine bestimmte Zeitzone mit der PHP-Funktion date_default_timezone_set festlegen. Dies legt die angegebene Zeitzone für Benutzer fest.

Grundsätzlich wird die Zeitzone der Benutzer auf die Clientseite gesetzt, daher müssen wir JavaScript verwenden.

Unten ist das Skript, um die Zeitzone der Benutzer mit PHP und JavaScript zu erhalten.

%Vor%

Aber aus meiner Sicht ist es besser, die Benutzer zu fragen, ob die Registrierung in Ihrem Projekt obligatorisch ist.

    
Sanjay Khatri 16.09.2010 05:59
quelle
15

javascript:

%Vor%

Geben Sie einfach Ihre Zeiten im UNIX-Timestamp-Format an diese Funktion weiter, Javascript kennt bereits die Zeitzone des Benutzers.

so:

php:

%Vor%

Dies zeigt die Zeiten immer korrekt an, basierend auf der Zeitzone, die die Person auf ihrer Computeruhr eingestellt hat, keine Notwendigkeit, irgendjemandem etwas zu fragen und es an Orten zu speichern, Gott sei Dank!

    
Envis 27.08.2011 23:00
quelle
14

Die Magie scheint alles in

zu sein %Vor%

Das ist cool, ich wusste nichts davon. Funktioniert es in IE usw.? Von dort aus sollten Sie in der Lage sein, mit JS zu ajaxieren, Cookies zu setzen, was auch immer. Ich würde wahrscheinlich selbst die Cookie-Route gehen.

Sie müssen es dem Benutzer jedoch erlauben, es zu ändern. Wir haben versucht, Geolocation (via Maxmind) vor einiger Zeit zu verwenden, und es war ziemlich oft falsch - genug, um es nicht wert zu machen, also lassen wir es einfach in seinem Profil einstellen und zeigen eine Benachrichtigung an Benutzer, die habe ihre noch nicht festgelegt.

    
Orion Edwards 03.08.2008 20:40
quelle
14

Verwenden Sie die IP-Adresse nicht, um den Standort (und die Zeitzone) definitiv zu bestimmen. Das liegt daran, dass IP-Adressen bei NAT, Proxies (zunehmend beliebt) und VPNs nicht unbedingt den tatsächlichen Standort des Benutzers widerspiegeln, sondern den Standort welche Server diese Protokolle implementieren.

Ähnlich wie die Ortskennzahlen nicht mehr nützlich sind, um einen Telefonbenutzer zu lokalisieren, angesichts der Popularität der Rufnummernportierung.

IP und andere oben gezeigte Techniken sind nützlich für , die einen Standard vorschlagen , den der Benutzer anpassen / korrigieren kann.

    
Jaime G 02.01.2013 18:05
quelle
11

Wenn Sie OpenID zur Authentifizierung verwenden, Einfache Registrierungserweiterung würde das Problem für authentifizierte Benutzer lösen (Sie müssen von tz in numerisch konvertieren).

Eine andere Option wäre, die Zeitzone aus der Ländereinstellung des Benutzeragenten abzuleiten. Dies ist eine etwas grobe Methode (wird nicht für en-US funktionieren), macht aber eine gute Annäherung.

    
Dmitry Shechtman 30.08.2008 09:29
quelle
11

Ein einfacher Weg dies zu tun ist mit:

%Vor%     
Naeem Ul Wahhab 01.12.2011 11:08
quelle
10

Hier ist ein Artikel (mit Quellcode), der erläutert, wie lokalisierte Zeit in einer ASP.NET-Anwendung (VB.NET, C #) ermittelt und verwendet wird:

Es ist Zeit

Kurz gesagt, der beschriebene Ansatz beruht auf der Funktion JavaScript getTimezoneOffset , die den Wert zurückgibt, der im Sitzungscookie gespeichert und von Code-Behind verwendet wird, um Zeitwerte zwischen GMT und lokaler Zeit anzupassen. Die nette Sache ist, dass der Benutzer die Zeitzone nicht spezifizieren muss (der Code tut es automatisch). Es ist mehr beteiligt (deshalb verlinke ich auf den Artikel), aber der mitgelieferte Code macht es wirklich einfach zu benutzen. Ich vermute, dass Sie die Logik in PHP und andere Sprachen konvertieren können (solange Sie ASP.NET verstehen).

    
Alek Davis 25.05.2010 00:11
quelle
8

Einfach mit JS und PHP :

Obwohl der Benutzer sich mit seiner internen Uhr und / oder Zeitzone herumschlagen kann, bleibt der beste Weg, den ich bis jetzt gefunden habe, um den Offset zu erhalten, new Date().getTimezoneOffset(); . Es ist nicht-invasiv, verursacht keine Kopfschmerzen und beseitigt die Notwendigkeit, sich auf Dritte zu verlassen.

Angenommen, ich habe eine Tabelle users , die ein Feld date_created int(13) enthält, um Unix-Zeitstempel zu speichern;

Angenommen, ein Client creates a new account , Daten werden von post empfangen, und ich muss insert/update die date_created column mit dem Unix-Timestamp des Clients, nicht die des Servers.

Da der timezoneOffset zum Zeitpunkt der Einfügung / Aktualisierung benötigt wird, wird er als zusätzliches $ _POST-Element übergeben, wenn der Client das Formular absendet, wodurch die Speicherung in Sitzungen und / oder Cookies und ohne zusätzlichen Server entfällt trifft entweder.

%Vor%

Angenommen, der Server erhält tzo als $_POST['tzo'] ;

%Vor%

Einfügen / update date_created=$user_timestamp .

Beim Abrufen von date_created können Sie den Zeitstempel wie folgt umwandeln:

%Vor%

Nun, dieses Beispiel könnte den eigenen Bedürfnissen entsprechen, wenn es darum geht, einen first Zeitstempel einzufügen ... Wenn es um einen zusätzlichen Zeitstempel oder eine Tabelle geht, sollten Sie den Tzo-Wert in die Benutzertabelle einfügen zukünftige Referenz oder als Sitzung oder als Cookie festlegen.

P.S. ABER was, wenn der Benutzer reist und Zeitzonen schaltet. Meldet sich bei GMT + 4 an, fährt schnell zu GMT-1 und meldet sich erneut an. Letzte Anmeldung wäre in der Zukunft.

Ich denke ... wir denken zu viel nach.

    
man 15.09.2014 01:19
quelle
7

Versuchen Sie diesen PHP-Code

%Vor%     
pckabeer 30.07.2012 08:08
quelle
7

So mache ich es. Dadurch wird die PHP-Standardzeitzone auf die lokale Zeitzone des Benutzers eingestellt. Fügen Sie einfach Folgendes auf allen Ihren Seiten ein:

%Vor%     
Dane Iracleous 28.01.2012 08:21
quelle
6

Eine mögliche Option ist die Verwendung des Headerfelds Date , das in RFC 7231 definiert ist und soll die Zeitzone enthalten. Natürlich ist nicht garantiert, dass der Wert tatsächlich die Zeitzone des Kunden ist, aber es kann ein geeigneter Ausgangspunkt sein.

    
Berislav Lopac 08.09.2014 23:25
quelle
5

Sie können dies auf dem Client mit Moment-Zeitzone tun und den Wert an den Server senden; Beispielverwendung:

%Vor%     
SummerBreeze 13.09.2016 06:19
quelle
5

Das Abrufen eines gültigen TZ-Datenbank-Zeitzonennamens in PHP erfolgt in zwei Schritten:

1) Mit Javascript erhalten Sie Zeitzone Offset in Minuten durch getTimezoneOffset . Dieser Offset ist positiv, wenn die lokale Zeitzone hinter UTC liegt und negativ, wenn sie voraus ist. Sie müssen also dem Offset ein umgekehrtes Vorzeichen hinzufügen.

%Vor%

Übergeben Sie diesen Offset an PHP.

2) In PHP konvertieren Sie diesen Offset in einen gültigen Zeitzonennamen mit timezone_name_from_abbr Funktion.

%Vor%

Ich habe einen Blogeintrag darauf geschrieben: Ссылка Es enthält auch eine Demo.

    
Useful Angle 10.01.2017 11:56
quelle