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()会返回垃圾字符和正确的数据?也许我得到的与此相关:奇怪。什么操作系统版本?我把它作为一个新问题发布了出来:如果您能看一下,我将不胜感激。谢谢你的回答。