c++ - 在非英语 Windows 安装上识别 PST 时区
问题描述
我正面临这个奇怪的问题,我需要从日本 Windows 操作系统机器上获取 PST 时区信息(例如 MUI_Std、Std、TZI 等),但找不到可靠的方法。
我已经尝试过 RegLoadMUIStringW API。但它以本地化格式返回 PST 时区的名称。我有英文的 PST 时区名称。因此,使用此 API 的输出,我无法比较并判断从注册表读取的值是否适用于 PST 时区。
一种可能的解决方案是在代码中使用 PST 时区的 MUI_Std 值(该值为 @tzres.dll,-212),并将该值与从注册表读取的值进行比较。这样我就会知道我正在阅读的时区是否是 PST。但我不确定这是否是检测 PST 时区的可靠方法。
让我知道是否有人对此有任何意见。
解决方案
时区由它们的 ID(又称“键名”)标识,而不是它们的本地化名称。ID 未本地化。
因此,无论操作系统的语言如何,您都可以在以下位置找到太平洋时区信息:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Pacific Standard Time
在其中的值中,只有Std
、Dlt
和Display
值是本地化的,并且 MUI 值指向这些字符串在资源文件中的位置。资源文件随 Windows 语言包一起安装。请注意,您不应该硬编码一个值(例如,-212
),因为未来的更新可能会提供一个可以更改它的新字符串。
此外,如果您只需要检索给定 ID 的时区信息,您实际上根本不需要访问注册表。只需使用该EnumDynamicTimeZoneInformation
函数遍历时区,寻找与所需匹配的时区TimeZoneKeyName
(同样未本地化)。
但是,如果您正在寻找当前操作系统语言以外的语言的本地化,您可以尝试查看TimeZoneWindowsResourceExtractor项目。
推荐阅读
- android - 如果我单独在行中,GridLayout 添加视图以消耗所有可用宽度
- r - 将列表中的单词和代码识别为 0 或 1,将不在列表代码中的单词识别为 1
- php - 处理手动安装在 mac 上运行 codeigniter4
- c# - 如何锁定协程?
- python - 我正在浏览linkedin 配置文件,但出现错误
- spring - 如何在 spring-cloud-stream-binder-kafka-streams 中使用 jaas 配置
- ruby-on-rails - Heroku 一次性 Dyno 几乎立即进入 R14
- python - 在进行糖尿病视网膜病变项目时遇到此错误 - 索引 0 超出轴 0 大小为 0 的范围
- java - Spring,Hibernate:尝试删除时“与会话无关的集合所有者”
- java - 从 AlertDialog 保存不同的值