【问题标题】:Getting local timezone identifier when OS display language is non-english当操作系统显示语言为非英语时获取本地时区标识符
【发布时间】:2013-09-23 00:55:19
【问题描述】:

奇怪的是,TimeZone.CurrentTimeZone.StandardName 根据计算机显示语言返回本地化名称。我想要一个可以在以下代码中提供给TimeZoneInfo 的程序标识符。

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone);

FindSystemTimeZoneById 需要一个唯一的非本地化程序标识符

我将计算机显示语言更改为中文,当我执行TimeZone.CurrentTimeZone.StandardName 时,我得到了一个本地化的 unicode 字符串。但是该值是正确的,但它已本地化为计算机显示语言,这是我不想要的。

我现在没有使用 TimeZoneInfo.Local.Id 的选项,因为我的项目在 .Net 2.0 中。我还有哪些其他选项可以获得未本地化的时区标识符?

【问题讨论】:

    标签: c# .net timezone


    【解决方案1】:

    要在无法使用TimeZoneInfo 类的情况下获得TimeZoneInfo.Local.Id 的等效项,您必须直接进入注册表。

    在 .NET 2.0 C# 中,您可以使用以下方法检索它:

    private static string GetLocalTimeZoneId()
    {
        RegistryKey key = Registry.LocalMachine.OpenSubKey(
                            @"SYSTEM\CurrentControlSet\Control\TimeZoneInformation");
        string value = (string)key.GetValue("TimeZoneKeyName");
        if (string.IsNullOrEmpty(value))
            value = (string)key.GetValue("StandardName");
        key.Close();
        return value;
    }
    

    Windows Vista 和更高版本具有 TimeZoneKeyName 值,并且在 StandardName 值中具有 @tzres.dll 指针条目。

    在 Windows Vista 之前,StandardName 值包含键名,并且未本地化。

    上面的代码解释了这两种变化。

    【讨论】:

    • 谢谢马特。这就是我一直在寻找的答案!现在我唯一担心的是注册表路径是否对于所有 Windows 风格都保持不变?
    • 当我尝试使用它时,我得到了非常奇怪的结果。注册表项在 RegEdit 中看起来是正确的,但是当我使用 key.GetValue("TimeZoneKeyName") 读取它时,我得到的是一个包含 127 个字符的盒装字符串。第一个字符是时区的名称,然后是几个十六进制 00 字符(“\0\0”),然后是看起来像随机垃圾的东西。当然,我可以通过 IndexOf('\0') 自己提取名称,但为什么 key.GetValue() 会返回乱码以及正确的数据?
    • 也许我得到的与此有关:social.msdn.microsoft.com/Forums/sqlserver/en-US/…
    • 奇怪。什么操作系统版本?
    • 我已将此作为一个新问题发布:stackoverflow.com/questions/27716746/… 如果您能看一下,将不胜感激。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多