2010-06-05 31 views
24

Veritabanında tüm tarih/saatleri UTC'de saklıyorum..NET Saat dilimi adıyla zaman dilimi ofseti elde edin

Kullanıcının saat dilimini biliyorum (örneğin, "ABD Doğu Standart Saati").

Doğru saati görüntülemek için kullanıcının saat dilimi ofsetini UTC tarih/saatine eklemem gerektiğini düşünüyordum. Ancak, saat dilimi adıyla nasıl zaman dilimi telafi edebilirim?

Teşekkür ederiz!

cevap

37

Daha sonra sağlanan kimliği kullanarak TimeZoneInfo nesneyi, bundan TimeZoneInfo.GetUtcOffset almak için TimeZoneInfo.FindSystemTimeZoneById kullanabilirsiniz: dönüştürerek idare edecek TimeZoneInfo ait ConvertTime yönteminin yararlanmalıdır

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"); 
TimeSpan offset = tzi.GetUtcOffset(myDateTime); 
+0

Bu benim sorunumu çözdü. Teşekkür ederim! –

+0

Bu benim için çalışmıyor gibi görünüyor. Şu anda, "E. Avustralya Standart Saati" bölgesinde DST, bu yüzden zamanları GMT + 11'dir. Ancak, bunu çalıştırdığımda 10 saatlik bir sonuç elde ediyorum. 11 olmalıdır. Kod: TimeZoneInfo.FindSystemTimeZoneById ("E. Avustralya Standart Saati"). GetUtcOffset (Now.ToUniversalTime). Neyi yanlış yapıyorum? –

+0

@ ingredient_15939 - Muhtemelen yanlış bir şey yok. Bunun çalışmakta olduğu bilgisayarın DST'yi doğru şekilde kullanıp kullanmayacağını kontrol ettiniz mi? – Oded

4

TimeZoneInfo sınıfının GetSystemTimeZones() yöntemini kullanarak sunucunuzda yapılandırılan tüm saat dilimlerinin listesini alın ve istemcinizden biriyle eşleştirin.

Neden "ABD Doğu Standart Saati" biçiminde saat dilimleriniz var? Bu nereden geldi?

+0

Harika fikir, şimdi deneyin olacak :) Ben Aksine her 'TimeZone' nesnesinin Kimlik/dizede ile açılır doldurmak yerine –

+0

) (GetSystemTimeZones tarafından döndürülen koleksiyonu ile aşağı bir damla doldurma ediyorum Koleksiyon, neden yerine gerçek nesneleri "Öğe" olarak aşağıya eklemez? Bu sayede, aşağı açılırken, TimeZoneInfo nesnesine '(TimeZoneInfo) myDropDown.SelectedItem' kullanarak bir referans alabiliriz. Sonra her zaman '.FindSystemTimeZoneById' çağırmanız gerekmeyecekti, zaten nesne. –

2

yerine bazı manuel ekleme yapıyor belirttiğiniz TimeZone'a göre tarihiniz.

var localizedDateTime = TimeZoneInfo.ConvertTime(yourDateTime, localTimeZoneInfo); 
+0

Mükemmel tavsiye. –