2010-06-05 92 views
24

在數據庫中,我使用UTC存儲所有日期/時間。.NET通過時區名稱獲取時區偏移

我知道用戶的時區名稱(例如「美國東部標準時間」)。

爲了顯示正確的時間,我想我需要添加用戶的時區偏移到UTC日期/時間。但是,我如何通過時區名稱獲得時區偏移?

謝謝!

回答

37

您可以使用TimeZoneInfo.FindSystemTimeZoneById獲得使用提供的ID TimeZoneInfo.GetUtcOffset不同於TimeZoneInfo對象,那麼:

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

這解決了我的問題。謝謝! – 2010-06-05 07:43:35

+0

這似乎不適用於我。目前,它是「E.澳大利亞標準時間」區域的DST,因此它們的時間是GMT + 11。但是,當我運行這個時,我得到了10個小時的結果。它應該是11.代碼是:TimeZoneInfo.FindSystemTimeZoneById(「E。澳大利亞標準時間」)。GetUtcOffset(Now.ToUniversalTime).Hours。我究竟做錯了什麼? – 2011-12-02 13:07:10

+0

@ ingredient_15939 - 可能沒有錯。您是否檢查過運行的計算機是否設置爲正確使用DST? – Oded 2011-12-02 13:08:13

4

您可以使用TimeZoneInfo類的GetSystemTimeZones()方法來獲取服務器上配置的所有時區的列表,並將其與客戶端中的時區相匹配。

雖然爲什麼你有格式「美國東部標準時間」的時區?那個是從哪裏來的?

+0

偉大的想法,現在試試吧:) 我填充一個下拉與GetSystemTimeZones返回(集合) – 2010-06-05 07:28:48

+0

而不是在ID /每'TimeZone'對象的字符串填充下拉集合,爲什麼不把實際對象添加爲下拉菜單中的'Item's?這樣,當下拉改變時,你可以使用'(TimeZoneInfo)myDropDown.SelectedItem'獲取對TimeZoneInfo對象的引用。然後你不需要每次都調用'.FindSystemTimeZoneById',你已經擁有了目的。 – 2013-07-15 13:51:51

2

,而不是做一些手工此外,你應該採取的TimeZoneInfoConvertTime方法將處理轉換的優勢你的日期基於你指定的時區。

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

優秀的建議。 – 2015-08-12 06:51:12