如何在Windows中更改系统时区?

时间:2017-04-11 23:53:32

标签: c++ windows datetime winapi timezone

我正在编写一个允许更改Windows中使用的当前时区参数的软件:

enter image description here

到目前为止,我发现设置系统范围时区的唯一参考是SetTimeZoneInformation API(或其变体SetDynamicTimeZoneInformation。)但我不确定我怎么做用它来改变当前时区?

例如,它需要TIME_ZONE_INFORMATION结构包含有关本地时间偏移,夏令时设置等的各种信息。我不明白为什么我需要填写所有这些信息我想要做的是,将当前时区从"(UTC-08:00) Pacific Time (US & Canada)"更改为"(UTC-07:00) Mountain Time (US & Canada)"

我是否正在寻找正确的API来做到这一点?

2 个答案:

答案 0 :(得分:0)

老实说,最简单的方法就是使用tzutil.exe实用程序。如果您需要在Win32 C ++中执行此操作,则只需从ShellExecute进行调用。传递时区的ID,而不是显示名称。

另见my answer for doing this from .NET

答案 1 :(得分:0)

已经有一段时间了,所以让我试着回顾一下我最终做的事情。不幸的是我的解决方案是特定于操作系统:

  • 适用于Windows Vista&后

    1. 设置SE_TIME_ZONE_NAME权限。

    2. 通过指定要设置的时区的详细信息来呼叫SetDynamicTimeZoneInformation

    3. 删除SE_TIME_ZONE_NAME权限。

  • 对于Windows XP

    1. 设置SE_SYSTEMTIME_NAME权限。

    2. 使用有关要设置的时区的信息调用SetTimeZoneInformation

    3. 重置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。要获取有关当前时区的信息,请使用GetDynamicTimeZoneInformationGetTimeZoneInformation获取WinXP。

此外,您可能希望检索可用于选择新(默认)时区信息的所有可用时区的列表。您可以通过枚举/解析以下注册表项来获取它:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

检查herehere以获取有关其结构的信息。