微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows 10上的SetTimeZoneInformation后无法识别时区

如何解决Windows 10上的SetTimeZoneInformation后无法识别时区

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

解决方法

几件事:

  • 不要使用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" not 是时区ID。这只是当地人可读的字符串,表示夏令时生效时使用的时区名称。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。