javascript - print - node js timezone offset




Bestimmen Sie die Zeitzone eines Benutzers (16)

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

  1. Mit JavaScript erhalten Sie den Zeitzonenversatz in Minuten getTimezoneOffset . Dieser Versatz ist positiv, wenn die lokale Zeitzone hinter UTC liegt, und negativ, wenn sie vor UTC liegt. Sie müssen also dem Versatz ein entgegengesetztes Vorzeichen hinzufügen.

    var timezone_offset_minutes = new Date().getTimezoneOffset();
    timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;

    Übergeben Sie diesen Offset an PHP.

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

    // Just an example.
    $timezone_offset_minutes = -360;  // $_GET['timezone_offset_minutes']
    
    // Convert minutes to seconds
    $timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
    
    // America/Chicago
    echo $timezone_name;</code></pre>

Ich habe einen Blog-Beitrag dazu geschrieben: Wie man Benutzer-Zeitzonen in PHP erkennt . Es enthält auch eine Demo.

Gibt es eine Standardmethode, mit der ein Webserver die Zeitzone eines Benutzers innerhalb einer Webseite bestimmen kann?

Vielleicht aus einem HTTP-Header oder einem Teil der user-agent Zeichenfolge?


Eine einfache Möglichkeit ist die Verwendung von:

new Date().getTimezoneOffset();

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, bestehen 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 Feld date_created int(13) zum Speichern von Unix-Zeitstempeln enthält.

Angenommen, ein Client empfängt creates a new account Daten von post und ich muss insert/update den date_created column mit dem Unix-Zeitstempel des Clients, nicht den des Servers.

Da das timezoneOffset zum Zeitpunkt des Einfügens / Aktualisierens benötigt wird, wird es als zusätzliches $ _POST-Element übergeben, wenn der Client das Formular sendet, sodass es nicht mehr in Sitzungen und / oder Cookies gespeichert werden muss und auch keine zusätzlichen Serverzugriffe auftreten.

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;

Angenommen, der Server empfängt 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 .

Wenn Sie das Erstellungsdatum abrufen, können Sie den Zeitstempel folgendermaßen konvertieren:

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

Dieses Beispiel passt möglicherweise zu den eigenen Anforderungen, wenn es um das Einfügen eines first Zeitstempels geht ... Wenn es um einen zusätzlichen Zeitstempel oder eine zusätzliche Tabelle geht, können Sie den tzo-Wert zur späteren Bezugnahme in die Benutzertabelle einfügen oder festlegen als Session oder als Cookie.

PS ABER was ist, wenn der Benutzer reist und Zeitzonen wechselt. Meldet sich bei GMT + 4 an, reist schnell zu GMT-1 und meldet sich erneut an. Letzter Login würde in der Zukunft liegen.

Ich denke ... wir denken zu viel.


Sie können dies auf dem Client mit moment-timezone tun und den Wert an den Server senden. Beispielnutzung:

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

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'];
?>

Bisher gibt es keine HTTP-Header, die die Zeitzone des Clients angeben, obwohl vorgeschlagen wurde, diese 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.


Die beliebteste (== Standard?) Methode zur Bestimmung der Zeitzone, die ich gesehen habe, besteht darin , die Benutzer selbst zu befragen. Wenn für Ihre Website ein Abonnement erforderlich ist, kann dies in den Profildaten der Benutzer gespeichert werden. Für Nichtbenutzer können die Daten als UTC oder GMT oder als solche angezeigt werden.

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


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

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


Ich habe hier noch keine detaillierte Antwort gefunden, die die Zeitzone angibt. 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. In der Regel ist es wichtig, die aktuelle 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 Echtzeit-Konvertierungen spielt es keine Rolle.

Um die Zeitzone mit Javascript zu ermitteln, 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


JavaScript ist der einfachste Weg, um die Ortszeit des Kunden zu ermitteln. Ich würde vorschlagen, ein XMLHttpRequest zu verwenden, um die lokale Zeit zurückzusenden, und wenn dies fehlschlägt, auf die Zeitzone zurückzugreifen, 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 bereitstellen. Es ist ein Service, für den Sie bezahlen und der Ihre Datenbank monatlich aktualisiert. Sie bieten Wrapper in mehreren Web-Sprachen.


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 für diese Funktion einfach Ihre Zeiten im Unix-Zeitstempelformat 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>';

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!



Unter Verwendung des Ansatzes von Unkwntech habe ich eine Funktion mit jQuery und PHP geschrieben. Dies ist getestet und funktioniert!

Stellen Sie auf der PHP-Seite, auf der Sie die Zeitzone als Variable haben möchten, diesen Codeausschnitt irgendwo oben auf der Seite bereit:

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

Dadurch wird die Sitzungsvariable "time" gelesen, die wir jetzt erstellen.

Auf derselben Seite müssen Sie in <head> zunächst jQuery einfügen:

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

Fügen Sie auch im <head> unter der jQuery Folgendes 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://example.org/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

Möglicherweise haben Sie es bemerkt oder nicht, aber Sie müssen die URL zu Ihrer tatsächlichen Domain ändern.

Eine letzte Sache. Sie fragen sich wahrscheinlich, was zur Hölle timezone.php ist. Nun, es ist einfach so: (erstelle eine neue Datei mit dem Namen timezone.php und zeige mit der obigen URL darauf)

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

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-Zeitzonenoffset (GMT -7) oder die Zeitzone zurück, in der Sie sich befinden.


Verwenden Sie die IP-Adresse nicht, um den Standort (und damit die Zeitzone) endgültig zu bestimmen. Dies liegt daran, dass bei NAT, Proxies (immer beliebter) und VPNs die IP-Adressen nicht unbedingt den tatsächlichen Standort des Benutzers widerspiegeln, sondern den Standort der Server, die diese Protokolle implementieren, befinden sich.

Ähnlich wie US-Vorwahlen angesichts der Beliebtheit der Nummernübertragbarkeit nicht mehr für die Lokalisierung eines Telefonbenutzers nützlich sind.

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


Wenn Sie OpenID zur Authentifizierung verwenden, löst Simple Registration Extension das Problem für authentifizierte Benutzer (Sie müssen von tz zu numerisch konvertieren).

Eine andere Möglichkeit wäre, die Zeitzone aus den Ländereinstellungen des Benutzeragenten abzuleiten. Dies ist eine etwas grobe Methode (wird für en-US nicht funktionieren), aber eine gute Annäherung.





timezone-offset