我正在编写一个允许更改Windows中使用的当前时区参数的软件:
到目前为止,我发现设置系统范围时区的唯一参考是SetTimeZoneInformation
API(或其变体SetDynamicTimeZoneInformation
。)但我不确定我怎么做用它来改变当前时区?
例如,它需要TIME_ZONE_INFORMATION结构包含有关本地时间偏移,夏令时设置等的各种信息。我不明白为什么我需要填写所有这些信息我想要做的是,将当前时区从"(UTC-08:00) Pacific Time (US & Canada)"
更改为"(UTC-07:00) Mountain Time (US & Canada)"
。
我是否正在寻找正确的API来做到这一点?
答案 0 :(得分:0)
老实说,最简单的方法就是使用tzutil.exe
实用程序。如果您需要在Win32 C ++中执行此操作,则只需从ShellExecute
进行调用。传递时区的ID,而不是显示名称。
答案 1 :(得分:0)
已经有一段时间了,所以让我试着回顾一下我最终做的事情。不幸的是我的解决方案是特定于操作系统:
适用于Windows Vista&后强>:
设置SE_TIME_ZONE_NAME
权限。
通过指定要设置的时区的详细信息来呼叫SetDynamicTimeZoneInformation
。
删除SE_TIME_ZONE_NAME
权限。
对于Windows XP :
设置SE_SYSTEMTIME_NAME
权限。
使用有关要设置的时区的信息调用SetTimeZoneInformation
。
重置SE_SYSTEMTIME_NAME
权限。
最后,对于这两个操作系统,广播以下消息以让正在运行的应用程序知道时区已更改:
::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"intl",
SMTO_ABORTIFHUNG,
2 * 1000, //the total wait time can be up to the value of uTimeout multiplied by the number of top-level windows.
NULL);
PS。要获取有关当前时区的信息,请使用GetDynamicTimeZoneInformation
或GetTimeZoneInformation
获取WinXP。
此外,您可能希望检索可用于选择新(默认)时区信息的所有可用时区的列表。您可以通过枚举/解析以下注册表项来获取它:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones