不幸的是,目前沒有標準的功能來做到這一點。
允許檢查(使用反射器)TimeZoneInfo.FindSystemTimeZoneById()方法的工作方式。它只是需要值中的一個s_systemTimeZones場:
private static Dictionary<string, TimeZoneInfo> s_systemTimeZones
{
get
{
if (s_hiddenSystemTimeZones == null)
{
s_hiddenSystemTimeZones = new Dictionary<string, TimeZoneInfo>();
}
return s_hiddenSystemTimeZones;
}
set
{
s_hiddenSystemTimeZones = value;
}
}
此字段存儲所有可用的TimeZoneInfo-S。而當你調用FindSystemTimeZoneById(id)時,它只是從預填字典中選擇了一些值。我不知道這個字典何時初始化以及它用於初始化的值。但來自this thread的人告訴說,TimeZoneInfo使用來自注冊表的值:HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones
最明顯的方法是創建自己的詞典並填充它的值。類似這樣的:
Dictionary<string, TimeZoneInfo> dictionary = new Dictionary<string, TimeZoneInfo>();
TimeZoneInfo info = new TimeZoneInfo("ID", new TimeSpan(0, 1, 0, 0), "SomeCultureName", "Some Standard Time", "Some Daylight Time", null, true);
dictionary.Add("Some time", info);
但還有另一個問題:TimeZoneInfo構造函數是私有的。所以如果你想使用FindSystemTimeZoneById()和ConvertTimeFromUtc()功能,那麼你應該從零開始實現它。創建一些代表時區的課程,用時區信息創建和填寫此課程的詞典等...
不是很好的消息,我知道。但我希望它會爲你:)
嗯。我沒有真正使用IANA下載 - 我只是從我們網絡上最近的Linux機器複製了/ etc/zoneinfo的內容。事實證明,IANA文件是文本格式的,您必須通過時區編譯器(「zic」)運行它們。 「zic」來源也位於同一IANA頁面上;但是我想如果你有一臺Linux機器來使用二進制文件,那麼它更容易使用。 – 2012-03-31 01:08:27
這是[GitHub上的版本](https://github.com/mono/mono/tree/master/mcs/class/System.Core/System)。 – 2012-03-31 01:14:44