Javascript / PHP ve zaman dilimlerini

5 Cevap php

Ben kullanıcının zaman dilimi yaz saati uygulanıyor olmadığını ofset ve tahmin edebilmek istiyorum. Şu anda, ben bu için bulduğum en kesin kodu burada:

http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/

Yani bu bana ofset boyunca DST göstergesi verir.

Şimdi, kullanıcı için yerel tarih / saati çıkışına için benim PHP bu kullanmak istiyorum .... ama bunun için en iyi nedir? Ben 2 seçeneğiniz var rakam:

a) timezone_abbreviations_list çıkışından () rasgele aynı ofset sahiptir dilimini ve DST ayarını seçin. Sonra zaman doğru tedaviyi uygulamak için bu ile date_timezone_set () arayın.

b) UTC olarak tarih tedavi devam ama sadece üzerinde saat uygun sayıda eklemek için bazı damgası ek yapmak.

Benim duygu B seçeneği iyi bir yol olmasıdır. Bunun nedeni, A ile, ben yine de ofset / dst açısından doğru olsa da, şaşırtıcı sonuçlar verebilir sahne arkasında yerde bazı obscur kurallar olabilir (herhangi bilmiyorum bir zaman dilimini kullanıyor ama olabilir ki I) bunu ekarte sanmıyorum.

Ben o zaman da kullanıcının saat dilimi değişiklikleri (çok düşüktür) yakalamak için her oturumun başında Javascript kullanarak dilimini tekrar kontrol ediyorum ya da DST döneme geçmek.

Beyin dökümü için özür dilerim - Ben sadece yukarıdaki yaklaşımlar geçerli olduğunu güvence çeşit sonra gerçekten değilim.

Teşekkürler,

James.

5 Cevap

Sağlam javascript kullanarak bir kullanıcının dilimini belirlemek için. Çıkış jsTimezoneDetect.

Bu size sunucu tarafında datetime hesaplamalar için kullanabileceğiniz bir Olsen timezone veritabanı anahtarını verecektir.

Bu bir anket ise, "b" benim oyum.

İlk olarak, her zaman UTC saklanmalıdır. Bu dogmadır. Bu çok mantıklı dogma, size proje daha karmaşık alır sonra "Eminim, bunu takip olsaydı" diyerek sonuna kadar hangi tür. Diğer şeyler arasında, o zaman bütün noktalarını depolamak için tek kesin, tutarlı bir yoldur. Yaz saati ile herhangi bir zaman dilimi (01:30 genellikle örneğin, iki kez olur) anahtarı etrafında belirsiz zaman referansları vardır. Saat dilimleri arasında dönüştürme zaman da, çoğu zaman zaten bir aracı olarak UTC kullanarak sonuna kadar.

İkincisi, sitenizin uluslararası olup olmadığına karar vermek zorunda. Değilse, o zaman altı ABD zaman dilimleri için kurallar yapmak ve bunu bitirmek. Üç tarayıcılar kendi kaçık şekilde damgalarını raporlama, hala sadece 18 vaka var, ve bunları işlemek mümkün olmalıdır. Bunun ötesinde bir şey, ve bunun gün ışığından tasarruf zamanı farklılıkları tahmin için ileri derecede gerektirdiğini varsayalım gerekir. Kez farklı yerlerde farklı günlerde devreye.

B Sizin en büyük sorun bu takvim gibi bir uygulama eğer doğru bölge birisi Örneğin içeri ne zaman belirlenemiyor, zamanlama yine de Şubat varsayalım, bir sorun olacak olmasıdır. Kimse DST üzerinde. Birisi programları 5 Mayıs 18:00 (yerel) için bir şey. Görüyorsunuz UTC-4 ofset. Nasıl o kişi etmez (bu durumda zaman {[(0 DST (zaman meant UTC 2100 olduğu durumda) gözlemlediği New Brunswick, ya da Porto Riko, olup olmadığını biliyor musunuz )]} 2200 UTC nedir? Bu zor bir soru. This post yardım olabilir.

I think that without knowing the exact timezone, There will always be a chance you miss out on some obscure rule.
As with most internationalization issues, there tend more obscure rules than you expect.

Ben ancak seçenek A için gkimlikerdim: timezone şeyler beklediğiniz daha karmaşık olma eğilimindedir, çünkü tam "ofset doğru bir olasılıkla dilimini almak". Eğer dikkate gün ışığından yararlanma değişiklikleri almak özellikle. Eğer seçenek A için gkimlikerseniz, PHP tarafından sağlanan standart fonksiyonları kullanabilirsiniz.

Siz tahmin kalitesini artırmak için diğer ölçümler ile birleştirmek; örneğin:

  • Ziyaretçi istatistiklerine göre: en çok ziyaretçi gelen dilimini almak;
  • Accept_headers göre: bir timezone dili maç;
  • IP-geolocation dayalı: doğru zaman diliminde ülke ile maç.

Above birleştiren oldukça makul bir tahmin vermek gerekir. Ancak% 100 bir kesinlik elde edilemez.

Eğer güvenmek istiyorsan javascript sadece ileri geri utc zaman / zaman damgası göndermek ve istemci, yerel zaman gösterimine dönüştürmek sağlayabilirsiniz.

edit: basit müstakil örneği (jquery kullanarak)

<html>
  <head>
    <title>...</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      function foo(){
        $('.time').each( function() {
          var t = $(this);
          var d = new Date(Date.parse(t.text()));
          t.text(d.toLocaleString());
        });
      }
    </script>
  </head>
  <body>
    <div class="time"><?php echo gmdate(DateTime::RFC1123); ?></div>
    <button onclick="foo()">local time</button>
  </body>
</html>

If javascript is not available the user still sees a date/time though it's in UTC.
edit2: And there is a javascript library (or was it even a jquery plugin?) that does this kind of things plus some nifty conversions like "an hour ago", "last week" ..something like that. But I forgot the name :(

Please see also this alternative: http://stackoverflow.com/a/12682439/1691517

90 saat dilimleri algılar ve test platformlarında% 100 doğruluk vardır.