web-dev-qa-db-fra.com

Comment obtenir le fuseau horaire du client?

J'écris une application en utilisant Zend_Framework (pour que la solution puisse s'appuyer dessus).

Comment obtenir le fuseau horaire du client?

Par exemple, si quelqu'un à Moscou, en Russie, je veux obtenir 3 * 60 * 60 (car il y a UTC + 3). S'il est au Royaume-Uni, je veux zéro. S'il utilise UTC-3: 30 (Canada?), Je veux -3,5 * 60 * 60.

(ce n'est pas une question sur un format - je suis d'accord pour obtenir 'Europe/Moscou' ou 'UTC-3' pour Saint-Pétersbourg, en Russie, c'est plutôt d'obtenir les utilisations du client de fuseau horaire. Mais le delta en secondes est préférable)

La seule solution qui me vient à l'esprit est de laisser javascript obtenir l'heure locale pour moi et la rediriger.

27
Valentin Golev

Check-out cet article sur la façon de détecter le fuseau horaire en définissant un cookie via JavaScript qui contiendra le fuseau horaire du client. C'est assez long, mais c'est parce qu'il est assez verbeux. J'ai implémenté une solution dans ce sens dans l'une de mes propres applications et cela fonctionne assez bien.

Vous pouvez également envoyer le fuseau horaire via Ajax au serveur et lui faire faire tout ce dont vous avez besoin pour le faire ensuite. Ou, si vous ne faites aucun calcul côté serveur avec lui, appliquez simplement le côté client du fuseau horaire là où vous en avez besoin. Cela dépend vraiment de votre cas d'utilisation.

En plus de cela, je vous suggère de laisser le visiteur définir lui-même son fuseau horaire et de le stocker dans le cookie ou une session.

8
Gordon

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, vous devez tout d'abord inclure jQuery:

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

Toujours dans le, sous 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 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.

12
Westy92

Il s'agit d'une solution de cookie avec très peu de frais généraux:

  echo <<<EOE
   <script type="text/javascript">
     if (navigator.cookieEnabled)
       document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
   </script>
EOE;
  if (!isset($_COOKIE['tzo'])) {
    echo <<<EOE
      <script type="text/javascript">
        if (navigator.cookieEnabled) document.reload();
        else alert("Cookies must be enabled!");
      </script>
EOE;
    die();
  }
  $ts = new DateTime('now', new DateTimeZone('GMT'));
  $ts->add(DateInterval::createFromDateString($_COOKIE['tzo'].' minutes'));
2
Bernhard Lauber