Müşterinin dilimini almak nasıl?

4 Cevap php

Ben Zend_Framework kullanan bir uygulama yazma ediyorum (yani çözüm güvenebilirsiniz).

Müşterinin dilimini almak nasıl?

Moskova, Rusya birisi, ben 3 * 60 * 60 almak istiyorsanız Örneğin, (UTC +3 var çünkü). O İngiltere'de ise, ben sıfır istiyorum. O UTC-3 kullanıyorsa: 30 (? Kanada), ben -3.5 * 60 * 60 istiyorum.

(Bir biçimi hakkında bir soru değil - Ben St Petersburg, Rusya için 'Europe / Moskova' ya da 'UTC-3' alma ile Tamam, kullandığı oldukça timezone müşteri alma hakkında Ama saniye delta tercih edilir.)

Akla gelen tek çözüm javascript benim için yerel saati almak ve yönlendirmek izin vermektedir.

4 Cevap

Müşterinin dilimini yapacak JavaScript aracılığıyla bir Cookie ayarlayarak this article on how to detect the timezone göz atın. Oldukça lenghty, ama oldukça ayrıntılı çünkü olmasıdır. Ben kendi apps birinde bu doğrultuda bir çözüm uyguladık ve oldukça iyi çalışıyor.

Ayrıca sunucuya Ajax ile dilimini göndermek ve bunu daha sonra bunu yapmak için ne gerekiyorsa yapmak olabilir. Eğer onunla herhangi serverside hesaplamalar yapıyor değilse gerektiğinde Veya, sadece zaman dilimi istemci tarafında geçerlidir. Gerçekten usecase bağlıdır.

Buna ek olarak, ben size ziyaretçi onun dilimini kendini bildirmek ve Cookie veya bir Oturumunda olduğunu saklamak öneririz.


EDIT Link artık bozuldu Önerilen. : Aşağıda yorum olarak verilen diğer önerilen linke bakın

JQuery ve PHP kullanarak bir fonksiyon yazdım. Bu test edilir ve çalışır!

Eğer bir değişken olarak dilimini olmasını istiyoruz PHP sayfasında, yerde sayfanın üstüne yakın kod pasajı var:

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

Bu şimdi yaratmak üzere olan, oturum değişken "zaman" okuyacak.

Aynı sayfada, içinde, her şeyden önce jQuery eklemeniz gerekir:

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

Ayrıca, jQuery aşağıda, bu yapıştırın:

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

Siz veya fark olmayabilir, ama gerçek etki url değiştirmek gerekir.

One last thing. You are probably wondering what the heck timezone.php is. Well, it is simply this: (create a new file called timezone.php and point to it with the above url)

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

Bu düzgün çalışırsa, bu ilk sayfayı yüklemek JavaScript yürütmek ve sayfayı olacaktır. Daha sonra $ timezone değişken okumak ve zevk için kullanmak mümkün olacak! Bu (GMT -7) ofset geçerli UTC / GMT zaman dilimini döndürür yoksa içeri ne olursa olsun timezone

Ben senin en iyi bahis istemci tarafından üzerine gönderilen Accept-Language başlığına dayanarak tahmin olduğunu düşünüyorum.

Bu çok az bir çabayla çerez çözümdür:

  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'));