如何解决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 举报,一经查实,本站将立刻删除。