javascript print Bestimmen Sie die Zeitzone eines Benutzers




node js timezone offset (20)

Zunächst 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 getTimezoneOffset , aber das ist nicht ganz dasselbe wie eine vollständige IANA-Zeitzone wie America/Los_Angeles .

Es gibt jedoch einige Möglichkeiten, die funktionieren können:

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

    const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
    

    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 .

  • Wenn Sie eine größere Anzahl von Umgebungen unterstützen möchten, z. B. ältere Webbrowser, können Sie eine Bibliothek verwenden, um eine fundierte Schätzung für die Zeitzone zu erstellen. Sie arbeiten zunächst mit der Intl API, sofern diese verfügbar ist, und wenn sie nicht verfügbar ist, getTimezoneOffset sie die Funktion getTimezoneOffset des Date Objekts zu verschiedenen Zeitpunkten ab und verwenden die Ergebnisse, um eine geeignete Zeitzone aus einem internen Datensatz auszuwählen.

    Sowohl https://bitbucket.org/pellepim/jstimezonedetect als auch moment-timezone haben diese Funktionalität.

    // using jsTimeZoneDetect
    var tzid = jstz.determine().name();
    
    // using moment-timezone
    var tzid = moment.tz.guess();
    

    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.

    Darüber hinaus 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. Mehr dazu hier.

Letztlich ist ein besserer Ansatz, 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 Standardeinstellung zu wählen, aber machen Sie es nicht unmöglich, von der in Ihrer App abzuweichen.

Es gibt auch den völlig anderen Ansatz, sich nicht auf die Zeitzoneneinstellung des Benutzercomputers zu verlassen. 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 auf mobilen Geräten gut.

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?


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 sie dann mit Ajax oder ähnlichem auf den Server zu übertragen.


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

Es ist Zeit

Kurz gesagt, der beschriebene Ansatz getTimezoneOffset auf der Funktion JavaScript getTimezoneOffset , die den Wert zurückgibt, der im Sitzungscookie gespeichert ist und von Code- getTimezoneOffset 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).


Hier ist ein vollständigerer Weg.

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

Außer unten:

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    //go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        //To ignore daylight saving time look for the lowest offset.
        //Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

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


Wenn Sie OpenID für die Authentifizierung verwenden, würde die einfache Registrierungserweiterung 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), aber es ist eine gute Annäherung.


Versuchen Sie diesen PHP-Code

<?php  
$ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json['LocalTimeZone'];
?>

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:

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

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

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

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

Auch in der, unterhalb der jQuery, fügen Sie dies ein:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://domain.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

Sie haben vielleicht bemerkt oder nicht bemerkt, aber Sie müssen die URL zu Ihrer tatsächlichen 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 darauf mit der obigen URL)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

Wenn dies korrekt 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! Es gibt den aktuellen UTC / GMT-Zeitzonen-Offset (GMT -7) oder die Zeitzone zurück, in der Sie sich gerade befinden.



Einfach mit JS und PHP :

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

date_created int(13) ich habe einen Tabellenbenutzer, der ein Feld date_created int(13) , um Unix-Zeitstempel zu speichern;

Wenn ein Client creates a new account , werden die Daten per post empfangen, und ich muss die date_created column mit dem Unix-Zeitstempel des Clients und nicht mit dem Server insert/update .

Da der timezoneOffset zum Zeitpunkt des Einfügens / Aktualisierens benötigt wird, wird er als zusätzliches $ _POST-Element übergeben, wenn der Client das Formular absendet. Dadurch entfällt die Speicherung in Sitzungen und / oder Cookies und keine zusätzlichen Servertreffer.

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;

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

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']);
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not.
$user_timestamp = strtotime($user_time);

Einfügen / Aktualisieren date_created=$user_timestamp .

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

$date_created = //get from db
$created = date("F j, Y, g:i a",$date_created);//return it to the user or whatever

Nun kann dieses Beispiel den eigenen Bedürfnissen entsprechen, wenn es um das Einfügen eines first Zeitstempels geht ... Wenn es um einen zusätzlichen Zeitstempel oder eine Tabelle geht, sollten Sie den Tzo-Wert in die Benutzertabelle einfügen, um später darauf Bezug zu nehmen es als Sitzung oder als Cookie.

PS 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. Letzter Login wäre in der Zukunft.

Ich denke ... wir denken zu viel nach.


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 der Server Implementierung dieser Protokolle liegen.

Ähnlich wie die Vorwahlnummern nicht mehr nützlich sind, um einen Telefonbenutzer zu finden, angesichts der Popularität der Nummernportabilität.

IP und andere oben gezeigte Techniken sind nützlich, um einen Standard vorzuschlagen , den der Benutzer anpassen / korrigieren kann.


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


Ich habe hier noch keine detaillierte Antwort bekommen, die die Zeitzone bekommt. 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. In der Regel ist es wichtig, die tatsächliche Zone zu ermitteln, 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:

>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.

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

https://github.com/scottwater/jquery.detect_timezone


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 . Dies legt die angegebene Zeitzone für Benutzer fest.

Grundsätzlich ist die Zeitzone der Benutzer auf der Client-Seite, also müssen wir JavaScript dafür verwenden.

Im Folgenden finden Sie ein Skript, um die Zeitzone der Benutzer mithilfe von PHP und JavaScript zu ermitteln.

<?php
#http://www.php.net/manual/en/timezones.php List of Time Zones
function showclienttime()
{
  if(!isset($_COOKIE['GMT_bias']))
  {
    ?>
    <script type="text/javascript">
    var Cookies = {};
    Cookies.create = function (name, value, days) {
      if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
      } else {
        var expires = "";
      }
      document.cookie = name + "=" + value + expires + "; path=/";
      this[name] = value;
    }

    var now = new Date();
    Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
    window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
    </script>
    <?php
  } else {
    $fct_clientbias = $_COOKIE['GMT_bias'];
  }

  $fct_servertimedata = gettimeofday();
  $fct_servertime = $fct_servertimedata['sec'];
  $fct_serverbias = $fct_servertimedata['minuteswest'];
  $fct_totalbias = $fct_serverbias – $fct_clientbias;
  $fct_totalbias = $fct_totalbias * 60;
  $fct_clienttimestamp = $fct_servertime + $fct_totalbias;
  $fct_time = time();
  $fct_year = strftime("%Y", $fct_clienttimestamp);
  $fct_month = strftime("%B", $fct_clienttimestamp);
  $fct_day = strftime("%d", $fct_clienttimestamp);
  $fct_hour = strftime("%I", $fct_clienttimestamp);
  $fct_minute = strftime("%M", $fct_clienttimestamp);
  $fct_second = strftime("%S", $fct_clienttimestamp);
  $fct_am_pm = strftime("%p", $fct_clienttimestamp);
  echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
}

showclienttime();
?>

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


Javascript:

function maketimus(timestampz)
{
    var linktime = new Date(timestampz * 1000);
    var linkday = linktime.getDate();
    var freakingmonths=new Array();

    freakingmonths[0]="jan";
    freakingmonths[1]="feb";
    freakingmonths[2]="mar";
    freakingmonths[3]="apr";
    freakingmonths[4]="may";
    freakingmonths[5]="jun";
    freakingmonths[6]="jul";
    freakingmonths[7]="aug";
    freakingmonths[8]="sep";
    freakingmonths[9]="oct";
    freakingmonths[10]="nov";
    freakingmonths[11]="dec";

    var linkmonthnum = linktime.getMonth();
    var linkmonth = freakingmonths[linkmonthnum];
    var linkyear = linktime.getFullYear();
    var linkhour = linktime.getHours();
    var linkminute = linktime.getMinutes();

    if (linkminute < 10)
    {
        linkminute = "0" + linkminute;
    }

    var fomratedtime = linkday + linkmonth + linkyear + " " + linkhour + ":" + linkminute + "h";
    return fomratedtime;
}    

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

so was:

php:

echo '<script type="text/javascript">
var eltimio = maketimus('.$unix_timestamp_ofshiz.');
document.write(eltimio);
</script><noscript>pls enable javascript</noscript>';

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


you could do it on client with moment-timezone and send the value to server; sample usage:

> moment.tz.guess()
"America/Asuncion"


Der beliebteste (== Standard?) Weg, um die Zeitzone zu bestimmen, die ich gesehen habe, ist einfach die Benutzer selbst zu fragen. Wenn Ihre Website ein Abonnement erfordert, könnte dies in den Profildaten der Benutzer gespeichert werden. 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 Programmierkontextes feinere Lösungen haben.


Hier ist, wie ich es mache. Dadurch wird die PHP-Standardzeitzone auf die lokale Zeitzone des Benutzers eingestellt. Fügen Sie einfach Folgendes auf alle Ihre Seiten ein:

<?php
session_start();

if(!isset($_SESSION['timezone']))
{
    if(!isset($_REQUEST['offset']))
    {
    ?>
        <script>
        var d = new Date()
        var offset= -d.getTimezoneOffset()/60;
        location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
        </script>
        <?php   
    }
    else
    {
        $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
        $index = array_keys($zonelist, $_REQUEST['offset']);
        $_SESSION['timezone'] = $index[0];
    }
}

date_default_timezone_set($_SESSION['timezone']);

//rest of your code goes here
?>

Die Magie scheint alles zu sein

visitortime.getTimezoneOffset()

Das ist cool, das wusste ich nicht. 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 sie noch nicht eingestellt.


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

-new Date().getTimezoneOffset()/60;






timezoneoffset