web-dev-qa-db-fra.com

obtenir le fuseau horaire de l'utilisateur

Duplicata possible:
Comment puis-je déterminer le fuseau horaire d'un utilisateur Web?

Quelle est la meilleure façon de procéder? php ou javascript. Quelqu'un peut-il me fournir des extraits? Merci.

41
andrei

Cela vous donnera le fuseau horaire en tant que variable PHP. 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 comme variable, ayez cet extrait de code quelque part vers le haut de la page:

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

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

Sur la même page, dans le <head> section, vous devez tout d'abord inclure jQuery:

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

Toujours dans le <head> section , collez ce jQuery:

<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 l'avez peut-être remarqué ou non, mais vous devez modifier l'URL de votre domaine actuel.

Une dernière chose. Vous vous demandez probablement ce qu'est le timezone.php. Eh bien, c'est simplement ceci: (créez 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 le fuseau horaire dans lequel vous vous trouvez.

Vous pouvez en savoir plus à ce sujet sur mon blog

À votre santé

</Westy92>

57
Westy92

Côté serveur, ce ne sera pas aussi précis qu'avec JavaScript. En attendant, il est parfois nécessaire de résoudre une telle tâche. Juste pour partager la solution possible dans ce cas, j'écris cette réponse.

Si vous devez déterminer le fuseau horaire de l'utilisateur, cela peut être fait via les services Geo-IP. Certains d'entre eux fournissent un fuseau horaire. Par exemple, celui-ci ( http://smart-ip.net/geoip-api ) pourrait aider:

<?php
$ip     = $_SERVER['REMOTE_ADDR']; // means we got user's IP address 
$json   = file_get_contents( 'http://smart-ip.net/geoip-json/' . $ip); // this one service we gonna use to obtain timezone by IP
// maybe it's good to add some checks (if/else you've got an answer and if json could be decoded, etc.)
$ipData = json_decode( $json, true);

if ($ipData['timezone']) {
    $tz = new DateTimeZone( $ipData['timezone']);
    $now = new DateTime( 'now', $tz); // DateTime object corellated to user's timezone
} else {
   // we can't determine a timezone - do something else...
}
33
Mikhus

Tout comme Oded a répondu. Vous devez avoir ce type de fonctionnalité de détection en javascript.

J'ai moi-même eu du mal avec cela et j'ai réalisé que le décalage n'était pas suffisant. Il ne vous donne par exemple aucune information sur l'heure d'été. J'ai fini par écrire du code à mapper aux clés de base de données zoneinfo.

En vérifiant plusieurs dates autour d'une année, vous pouvez déterminer plus précisément un fuseau horaire.

Essayez le script ici: http://jsfiddle.net/pellepim/CsNcf/

Modifiez simplement le fuseau horaire de votre système et cliquez sur Exécuter pour le tester. Si vous exécutez chrome vous devez cependant faire chaque test dans un nouvel onglet (et safar doit être redémarré pour détecter les modifications de fuseau horaire).

Si vous souhaitez plus de détails sur le code, consultez: https://bitbucket.org/pellepim/jstimezonedetect/

11
Jon Nylander