很遗憾,目前没有标准的功能来实现这一点。
让我们通过反射来检查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。当您调用FindSystemTimeZoneById(id)时,它只是从预先填充的字典中选择一些值。我不知道这个字典何时初始化以及用于初始化的哪些值。但是来自
此线程的人说TimeZoneInfo使用来自注册表的值:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones。
最明显的方法是创建自己的Dictionary字典并填充它的值。类似这样:
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()功能,则必须从头开始实现它。创建一个表示时区的类,创建并填充该类的字典与时区信息等等...
这不是很好的消息,我知道。但我希望对您有用 :)