2008-10-07 15 views
5

Veritabanında UTC'de tüm tarih-saat değerlerini depolayan bir çok-zaman dilimi web uygulamasına sahip, sunucuda eylemler gerçekleştiğinde, zamanı UTC'ye kolayca dönüştürebiliyorum. Ancak, bir istemci bir zaman veya zaman dilimi girdiğinde, onu algılamanın ve depolamanın en iyi yolu nedir?Bir web uygulamasının istemcisinin bulunduğu saat dilimini tespit etmenin ve depolamanın en iyi yolu nedir?

  1. o Sayfasında ICallbackEventHandler aracılığıyla sunucu tarafı kod Date.getTimezoneOffset() (javascript)
  2. Mesaj değerini alın:

    Şu anda aşağıdaki yapıyorum. sonraki herhangi İstek üzerine oturumu

  3. yılında değer
  4. Store, müşterinin zaman dilimini kullanarak çıkış/giriş datetime değerini hesaplayın.

Gerçek uygulamadan bağımsız olarak, bu zarif olmayan bir çözüm gibi görünüyor. Daha iyi bir yöntemi olan var mı?

cevap

4

Çok benzer bir şey yapıyorum, ancak şimdi istemci tarafında yerel tüm zamanları dönüştürmek için javascript kullanmayı tercih ediyorum. Sunucu oluşturulan sayfada UTC'de tüm zamanları verir ve javascript, sayfa yüklendiğinde onu dönüştürür.

Bu, sunucu zaman kodundaki karışıklığı ortadan kaldırır, çünkü her zaman ne zaman olduğunu bilirim (UTC). İstemci tarafında, tüm zaman değerlerini aynı anda biçimlendirmek için jquery ve her() işlevini kullanıyorum. JQuery ile işlemek için bunu kolaylaştırmak için her zaman gizli bir alanda bir unix zamanı olarak yazarım.

Bu yöntemle gördüğüm tek sorun şu ki, a) javascript'te henüz iyi bir tarih/saat biçimlendirme rutinim yok ve b) kullanıcının javascript'i kapalıysa, o zaman çalışmıyor .

+0

Bu düzgün bir çözümdür ve ben kabul tek. Bundan uzaklaşmamın tek nedeni, bir kullanıcının bir eylemi yapmak için X saat süresinin kalması gibi bir "geri sayım sayacı" senaryosuydu. Sunucuda bu mantığın olması gerektiğini hissettim, ama sanırım javascriptte iyi olurdu. –

+0

Kullanıcı üzerinde bir zaman sınırı olan her şey kesinlikle sunucuya karşı kontrol edilmelidir. Geri sayım sayacı bu soruyla ilişkili gibi görünüyor: http://stackoverflow.com/questions/198049/prevent-js-alert-from-pausing-timers Benzer bir fikir, bu, istemci tarafında doğrulama, hile yapmaya karşı savunmasızdır. – Mnebuerquo

+0

@Mnebuerquo iyi nokta. Muhtemelen melez bir yöntemle gitmem gerekecek. –

2

İstemci tarafından gönderilen "If-Modified-Since" başlığını sorgulamak için HttpRequest Nesnesinin "header" özelliğini kullanabilirsiniz. Bu başlık şöyle müşterinin zaman dilimini içeren bir biçimde bir tarih içermelidir:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT 

basit alt dize çıkarma size zaman dilimi kod verir. Ancak, korkarım ki tüm tarayıcılar bu başlığı göndermede tutarlı değil, bu yüzden biraz deneme yapmalısınız.

Saygılarımızla, Fabrizio

+1

Bu gerçekten harika bir çözüm! Keşke tüm tarayıcılarda çalışmayı isterdim, çünkü herhangi bir javascript kullanmam gerekmeyecek! Sonunda gördüğüm şey, bir HttpModule veya ilk değişkendeki bu değişkeni depolayan Sayfadan türeyen bir sınıf. Teşekkürler! –

+0

Bu tam olarak nasıl çalışır? Bana başlık bir saat dilimi yerine gmt gibi görünüyor. Bu, müşterinin bilgisayarının GMT'ye ayarlandığı anlamına mı geliyor? Bu, tarayıcının her zaman istek için GMT'yi kullandığı anlamına mı geliyor? – Mnebuerquo

İlgili konular