Question Déterminer le fuseau horaire d'un utilisateur


Existe-t-il un moyen standard pour qu'un serveur Web puisse déterminer le fuseau horaire d'un utilisateur dans une page Web?

Peut-être à partir d'un en-tête HTTP ou d'une partie de la chaîne user-agent?


536
2017-08-01 00:42


origine


Réponses:


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

La méthode getTimezoneOffset() va soustraire votre temps de GMT et retourner le nombre de minutes. Donc, si vous habitez en GMT-8, il reviendra 480.

Pour mettre cela en heures, divisez par 60. Notez également que le signe est le contraire de ce dont vous avez besoin - il calcule le décalage de GMT par rapport à votre fuseau horaire, et non le décalage de votre fuseau horaire par rapport à GMT. Pour résoudre ce problème, multipliez simplement par -1.

Notez également que w3school dit:

La valeur retournée n'est pas une constante, en raison de la pratique de l'utilisation   Heure d'été.


305
2017-11-27 17:52



La façon la plus populaire (== standard?) De déterminer le fuseau horaire que j'ai vu est simplement demander aux utilisateurs eux-mêmes. Si votre site Web nécessite un abonnement, il peut être enregistré dans les données de profil des utilisateurs. Pour les utilisateurs anon, les dates pourraient être affichées comme UTC ou GMT ou une telle.

Je n'essaie pas d'être intelligent. C'est juste que parfois certains problèmes ont des solutions plus fines en dehors de tout contexte de programmation.


178
2017-08-03 19:30



Il n'y a aucun en-tête HTTP qui rapportera le fuseau horaire des clients jusqu'ici bien qu'il ait été suggéré de l'inclure dans la spécification HTTP.

Si c'était moi, j'essaierais probablement d'aller chercher le fuseau horaire en utilisant JavaScript côté client, puis de le soumettre au serveur en utilisant Ajax ou quelque chose comme ça.


82
2017-08-01 12:19



Javascript est le moyen le plus simple d'obtenir l'heure locale du client. Je suggère d'utiliser un XMLHttpRequest pour renvoyer l'heure locale, et si cela échoue, revenez au fuseau horaire détecté en fonction de leur adresse IP.

En ce qui concerne la géolocalisation, j'ai utilisé MaxMind GeoIP sur plusieurs projets et cela fonctionne bien, même si je ne suis pas sûr qu'ils fournissent des données de fuseau horaire. C'est un service que vous payez et ils fournissent des mises à jour mensuelles à votre base de données. Ils fournissent des wrappers dans plusieurs langues Web.


48
2017-08-01 15:11



Voici une solution JavaScript robuste pour déterminer le fuseau horaire dans lequel se trouve le navigateur.

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect


43
2017-08-06 21:22



Voici une manière plus complète.

  1. Obtenir le décalage de fuseau horaire pour l'utilisateur
  2. Testez quelques jours sur les limites DLS pour déterminer si elles sont dans une zone qui utilise DLS.

Sauf ci-dessous:

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;
}

Obtenir TZ et DST de JS (Via Way Back Machine)


36
2018-03-30 20:48



En utilisant l'approche de Unkwntech, j'ai écrit une fonction en utilisant jQuery et PHP. Ceci est testé, et fonctionne!

Sur la page PHP où vous voulez avoir le fuseau horaire en tant que variable, ayez cet extrait de code quelque part près du haut de la page:

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

Cela va lire la variable de session "time", que nous sommes sur le point de créer.

Sur la même page, dans le, vous devez d'abord inclure jQuery:

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

Aussi dans le, ci-dessous le jQuery, collez ceci:

<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>

Vous pouvez ou non avoir remarqué, mais vous devez changer l'URL de votre domaine actuel.

Une dernière chose. Vous vous demandez probablement ce que le diable timezone.php est. Eh bien, c'est simplement ceci: (créer un nouveau fichier appelé timezone.php et pointez-le avec l'URL ci-dessus)

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

Si cela fonctionne correctement, il chargera d'abord la page, exécutera le JavaScript et rechargera la page. Vous pourrez alors lire la variable $ timezone et l'utiliser à votre guise! Il renvoie le décalage de fuseau horaire UTC / GMT actuel (GMT -7) ou quel que soit le fuseau horaire dans lequel vous vous trouvez.


27
2018-04-09 19:16



Tout d'abord, comprenez que la détection de fuseau horaire en JavaScript est imparfaite. Vous pouvez obtenir le local décalage de fuseau horaire pour une date et une heure particulières en utilisant getTimezoneOffset sur une instance de la Date objet, mais ce n'est pas tout à fait la même chose qu'un plein IKA fuseau horaire comme America/Los_Angeles.

Il y a quelques options qui peuvent fonctionner cependant:

  • La plupart des navigateurs modernes prennent en charge les fuseaux horaires de l'IANA dans leur mise en API ECMAScript Internationalization, ainsi vous pouvez faire ceci:

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

    Le résultat est une chaîne contenant le paramètre de fuseau horaire IANA de l'ordinateur sur lequel le code est en cours d'exécution.

    Les environnements pris en charge sont répertoriés dans la table de compatibilité Intl. Élargir la DateTimeFormat section, et regardez la fonctionnalité nommée resolvedOptions().timeZone defaults to the host environment.

  • Si vous devez prendre en charge un plus grand nombre d'environnements, tels que les anciens navigateurs Web, vous pouvez utiliser une bibliothèque pour créer supposition éclairée au fuseau horaire. Ils travaillent en essayant d'abord le Intl API si elle est disponible, et quand elle n'est pas disponible, ils interrogent le getTimezoneOffset fonction du Date objet, pour plusieurs points différents dans le temps, en utilisant les résultats pour choisir un fuseau horaire approprié à partir d'un ensemble de données interne.

    Tous les deux jsTimezoneDetect et moment-fuseau horaire avoir cette fonctionnalité.

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

    Dans les deux cas, le résultat ne peut être considéré que comme une estimation. L'estimation peut être correcte dans de nombreux cas, mais pas tous.

    De plus, ces bibliothèques doivent être mises à jour périodiquement pour contrecarrer le fait que de nombreuses implémentations JavaScript plus anciennes ne connaissent que le actuel règle de l'heure d'été pour leur fuseau horaire local. Plus de détails à ce sujet ici.

En fin de compte, une meilleure approche consiste à demander à votre utilisateur pour leur fuseau horaire. Fournir un paramètre qu'ils peuvent changer. Vous pouvez utiliser l'une des options ci-dessus pour choisir défaut réglage, mais ne le rend pas impossible de dévier de cela dans votre application.

Il y a aussi l'approche entièrement différente de ne pas s'appuyer sur le paramètre de fuseau horaire de l'ordinateur de l'utilisateur du tout. Au lieu de cela, si vous pouvez rassembler les coordonnées de latitude et de longitude, vous pouvez les résoudre en fuseau horaire en utilisant une de ces méthodes. Cela fonctionne bien sur les appareils mobiles.


21
2018-03-25 03:47