【问题标题】:Timezone not recognized after SetTimeZoneInformation on Windows 10Windows 10 上的 SetTimeZoneInformation 后时区无法识别
【发布时间】:2020-08-31 14:15:48
【问题描述】:

我正在尝试使用 Windows API 并遵循 documentation 更改 Windows 10 上的时区。我正在传递时区偏差、标准名称和日光名称,它们在注册表中肯定是公认的时区(“中欧标准时间”和“中欧夏令时间”)。时钟设置为正确的时间,但是当我在控制面板中打开时区设置时,我看到消息 Your current time zone is not recognized. Please select a valid time zone.。当我点击Change time zone 按钮时,我看到我的时区在下拉菜单中被选中,但是当我输入设置时它没有显示。如何更改此设置或检查时区是否在注册表中的某处正确设置?

【问题讨论】:

    标签: c++ windows timezone


    【解决方案1】:

    一些事情:

    • 不要使用SetTimeZoneInformation,因为它不支持现代 Windows 中使用的完整“动态”时区信息。请改用SetDynamicTimeZoneInformation。 (文档在这方面有点误导,因为 Windows Vista 和更新版本就是这种情况,而不仅仅是 Windows 7 和 8。)

    • 忽略SetTimeZoneInformation 文档中的示例。它具有有关时区偏差和 DST 信息的硬编码信息。这不是一个好主意。相反,使用EnumDynamicTimeZoneInformation 函数在TimeZoneKeyName 字段中定位具有所需ID 的区域。找到后,将 DYNAMIC_TIME_ZONE_INFORMATION 结构传递给 SetDynamicTimeZoneInformation 函数以更改时区。

    • 字符串"Central Europe Standard Time" 是时区的ID(键名),并带有以下相关的英文本地化字符串:

      • 显示名称:"(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague"
      • 标准名称:"Central Europe Standard Time"
      • 日光名称:"Central Europe Daylight Time"
    • ID 和英文标准名称恰好匹配纯属巧合。并非所有 Windows 时区都以英语匹配,如果操作系统语言不是英语,它们肯定不会匹配。不要以为他们会。

    • 字符串"Central Europe Daylight Time" 不是时区ID。它只是一个本地化的人类可读字符串,用于在夏令时生效时使用的时区名称。

    • 由于SetDynamicTimeZoneInformation 需要SE_TIME_ZONE_NAME 权限,您可能会发现使用/s 参数执行TZUtil.exe 实用程序以通过ID 设置时区更容易。它已经拥有该特权。

    【讨论】:

    • 谢谢,成功了!我最终使用了EnumDynamicTimeZoneInformationSetDynamicTimeZoneInformation 的组合,我首先在其中找到基于标准名称的动态 tz 信息并将其传递给 setter。干杯!
    • 只是一点点编辑,您在本地化方面是对的,标准名称和日间名称被翻译成您的本地操作系统语言,但是来自 DynamicTimezoneInformation 的 TimeZoneKeyName 用作键并且始终是英文所以它可以一直使用。 :)
    • 是的 - 这是正确的。键名始终是那些确切的字符串(包括任何标点符号)并且永远不会本地化。它们来自HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 的注册表。它们实际上是注册表项名称。
    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多