C# 当操作系统显示语言为非英语时获取本地时区标识符

C# 当操作系统显示语言为非英语时获取本地时区标识符,c#,.net,timezone,C#,.net,Timezone,奇怪的是,TimeZone.CurrentTimeZone.StandardName根据计算机显示语言返回本地化名称。我想要一个编程标识符,可以在下面的代码中提供给TimeZoneInfo TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone); FindSystemTimeZoneById需要一个唯一的未本地化编程标识符 我将我的计算机显示语言更改为中文,当我执行TimeZone.CurrentTim

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

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
FindSystemTimeZoneById
需要一个唯一的未本地化编程标识符

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


我现在没有使用
TimeZoneInfo.Local.Id
的选项,因为我的项目在.NET2.0中。要获取未本地化的时区标识符,我还需要哪些其他选项?

要获取与
TimeZoneInfo.Local.Id
等效的时区标识符,而不必使用
TimeZoneInfo
类,您必须直接转到注册表

在.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
值包含键名,并且未本地化


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

谢谢Matt。这就是我一直在寻找的答案!现在我唯一担心的是注册表路径是否对所有风格的Windows都保持不变?当我尝试使用它时,我得到了非常奇怪的结果。注册表项在RegEdit中看起来是正确的,但是当我使用key.GetValue(“TimeZoneKeyName”)读取它时,我得到的是一个包含127个字符的装箱字符串。第一个字符是时区的名称,后面是两个十六进制00字符(“\0\0”),后面是看起来像随机垃圾的东西。当然,我可以通过IndexOf('\0')自己提取名称,但是为什么key.GetValue()会返回垃圾字符和正确的数据?也许我得到的与此相关:奇怪。什么操作系统版本?我把它作为一个新问题发布了出来:如果您能看一下,我将不胜感激。谢谢你的回答。