我剛剛發現這個老十歲上下的懸而未決的問題,所以認爲我應該在它採取刺傷。
總之 - 是這種方法有效/安全嗎?
這一切都取決於你打算用他們做什麼。
如果你只是在服務器端代碼中使用它,那麼是的。您只需存儲時區的Id
,並向用戶顯示相應的DisplayName
。 FindSystemTimeZoneById
和GetSystemTimeZones
對此完全有效。
請記住,雖然Id
值總是一樣的 - DisplayName
屬性將根據您正在運行的代碼的Windows操作系統的語言是不同的。執行是而不是文化意識,所以只需在.Net中設置不同的目標文化將不會更改DisplayName
字符串。
在Microsoft Windows時區數據庫中的記錄是相當穩定,並保持通過Windows Update更新。 某些的信息來自注冊表,但本地化的資源字符串來自tzres.dll
。當然,所有這些都是由TimeZoneInfo
和相關類隱藏的。
但是,如果你路過這些時區Id
值與其它系統 - 當心。與以前版本的Windows有一些變化。例如,我知道用於顯示名稱的顯示名稱都在其中,現在更正確地說「UTC」。 Id
值是相同的,但是誰確切地知道還有哪些不一致。特別是如果目標計算機尚未收到您擁有的同一組Windows Update。順便說一句 - 更新公佈here。
你也應該知道有關Windows時區數據庫中的幾件事情:
你也應該知道,TimeZoneInfo
是密不可分的DateTime
和DateTimeOffset
類。這些都有他們自己的怪癖。 DateTimeOffset
有點用處,但DateTime
充滿了細微差別。閱讀:
一個遠更好的解決日期和時間在.NET是使用NodaTime。該庫實現了兩個時區數據庫,包括它們之間的CLDR映射。它還提供了一個更安全的API,不會讓你陷入困境。這可能需要一些重新學習,但在您知道之前,您將使用類如LocalDateTime
,ZonedDateTime
,OffsetDateTime
和Instant
。
您仍然有時區數據庫經常更新的問題,因爲我們將計時規則留給政客。但the TZDB folks在保持歷史數據庫準確性方面做得非常好,並且在區域名稱更改時提供別名/鏈接。您可以看到tz名稱here的列表。此外,如果您使用NodaTime,則可以選擇將TZDB的副本粘貼到發行版中,也可以將自己的副本隨應用程序一起發送。您可以(理論上)編寫您自己的代碼,從IANA下載最新版本並保持應用程序更新 - 所有這些都不依賴於主機操作系統。
你看過['DateTimeOffset'](http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx)嗎?或['NodaTime'](http://code.google.com/p/noda-time/)? – Oded
相關:http://stackoverflow.com/q/2532729/1583 – Oded
@Oded與DateTimeOffset的問題是,它不是日光節約知道 – Paparazzi