时间:2011-01-06 18:04:11

标签: silverlight datetime timezone

3 个答案:

答案 0 :(得分:2)

不幸的是,目前没有标准功能可以做到这一点。

让我们检查(使用反射器)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()功能,那么您应该从头开始实现它。创建一个代表时区的类,用时区信息创建和填充这个类的字典等等。
我知道,这不是一个好消息。但我希望它对你有用:)

答案 1 :(得分:1)

有点晚了,但是我做了一段时间,然后将它发布在MS社区网站上供人们使用,因为它总是被问到。我没有进行时区ID查找,但我在SL应用程序中使用了FromSerializedString()方法。我的Web服务将ToSerializedString()数据作为字符串属性传递,而在SL中我将根据需要使用此对象。我做了一个TimeZoneInfo对象的反射器。

https://github.com/TWhidden/DevStuff/blob/master/StackOverflow/TimeZoneInfo.cs

不确定这是否有助于您(或此帖子的任何未来读者)。

这很有趣,并解决了我的问题。我正在使用这个用于V3 Silverlight,所以它应该适用于4/5,但也可以由微软改进。

更新了2017-04-12:链接到GitHub,在PCL lib中使用它。应该适用于SL,但我们像MS多年前那样做了。

答案 2 :(得分:0)

如果有人遇到这个帖子,这就是我发现的......

TimeZoneInfo的Microsoft参考源代码(在完整的.NET 4 CLR中)包含TryGetTimeZoneByRegistryKey()方法,该方法从注册表项HKLM\Software\Microsoft\Windows NT\CurrentVersion\Time Zones获取时区。

我想如果您正在编写受信任的Silverlight应用程序,则可以使用P / Invoke进行注册表查找。

对于我们的应用,我们不希望显示要求完全信任权限的对话框。我做了一些搜索,发现Stephane Delcroix's open-source implementation - 我不确定是否有比这个链接更官方的来源。它适用于Unix时区数据库格式(zoneinfo),您可以从IANA download获取。

时区数据库非常大,如果包含它,它会膨胀Silverlight应用程序的大小。但我们只需要支持几个时区。我拿了一部分数据库并将其打包到我们的Silverlight应用程序中作为资源;然后我修改了Stephane的代码,从资源流而不是文件系统中读取。我不得不删除所有本地时间功能,因为没有/ etc / localtime。但是我们只需要命名的时区,以及在这些时区和UTC之间进行转换的能力。这种方法似乎没问题。