【问题标题】:Identify PST timezone on non-english Windows installation在非英语 Windows 安装上识别 PST 时区
【发布时间】:2020-04-08 15:46:17
【问题描述】:

我正面临这个奇怪的问题,我需要从日本 Windows 操作系统机器上获取 PST 时区信息(例如 MUI_Std、Std、TZI 等),但找不到可靠的方法。

我已经尝试过 RegLoadMUIStringW API。但它以本地化格式返回 PST 时区的名称。我有英文的 PST 时区名称。因此,使用此 API 的输出,我无法比较并判断从注册表读取的值是否适用于 PST 时区。

一种可能的解决方案是在代码中使用 PST 时区的 MUI_Std 值(该值为 @tzres.dll,-212),并将该值与从注册表读取的值进行比较。这样我就会知道我正在阅读的时区是否是 PST。但我不确定这是否是检测 PST 时区的可靠方法。

如果有人对此有任何意见,请告诉我。

【问题讨论】:

  • 恭喜您对stackoverflow提出的第一个问题,为了让其他开发人员提供答案,请您发布源代码来说明您到目前为止所尝试的内容。希望这是您众多问题中的第一个。

标签: c++ windows timezone


【解决方案1】:

时区由它们的 ID(也称为“键名”)而不是它们的本地化名称来标识。 ID 未本地化。

因此,无论操作系统的语言如何,您都可以在以下位置找到太平洋时区信息:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Pacific Standard Time

在其中的值中,只有StdDltDisplay 值是本地化的,MUI 值指向这些字符串在资源文件中的位置。资源文件随 Windows 语言包一起安装。请注意,您不应该对值进行硬编码(例如,-212),因为未来的更新可能会提供一个可以更改它的新字符串。

此外,如果您只需要检索给定 ID 的时区信息,您实际上根本不需要访问注册表。只需使用 EnumDynamicTimeZoneInformation 函数遍历时区,寻找与所需 TimeZoneKeyName 匹配的时区(同样未本地化)。

但是,如果您正在寻找这些语言的本地化当前操作系统语言,您可以尝试查看TimeZoneWindowsResourceExtractor 项目。

【讨论】:

  • 感谢您确认密钥名称。我想我可以将从注册表中获取的密钥名称与英文 PST 时区名称相匹配,这应该可以解决问题。
  • 只要您将键名与键名匹配,就可以了。但请注意 - 并非所有键名都采用相同格式或与您希望向用户显示的内容保持一致。
  • 我只关心 PST 键名。想要从注册表项中识别 PST 键。所以我认为这应该是安全的。
【解决方案2】:

我最近写了一篇SQL Shack article,展示了如何直接从 Windows PC 注册表中提取时区/时区调整信息。该技术展示了使用时区和时区调整信息构建文本文件的 C# 和 VB.net 桌面应用程序。我将代码放在my GitHub resource,如果它没有具体涵盖您需要的确切数据,您可以对其进行修改。 Johnson-Pint 先生早先在 SO 和他的博客上的内容确实帮助我构建了自己的想法。

HTH!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2016-12-08
    • 2021-01-11
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多