如何使用 windows api 更改时区设置

Posted

技术标签:

【中文标题】如何使用 windows api 更改时区设置【英文标题】:How to change time zone settings using windows api 【发布时间】:2012-03-24 04:48:33 【问题描述】:

我需要在我的应用程序中通过 API 更改 DST 和时区。 我在以下链接末尾修改并复制了“SetTimeZoneInformation”用法示例并运行它: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724944(v=vs.85).aspx

我假设我的时间设置应该反映在托盘或控制面板中的时间设置。但是什么也没发生。

以下几点也应该注意。

此代码修改“HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation”关键内容。 并且“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\my time zone”线程没有变化。但这就是我要找的!

有没有办法在 C++ 中使用 API 修改“我的时区”?

已添加(来自应在此处编辑的答案):

所以,实际上,我的目标是让我的应用程序在 Win7 下运行。现有功能使用 MANUAL DST 支持。因此,我需要以某种方式将此手动 DST 和 GMT 偏移设置与 Win7 同步。据我了解,SetTimeZoneInformation 函数只是尝试根据我的输入从现有的一组时区中查找时区。如果没有时区等于我的输入,Win7 使用默认时区,例如 UTC-12,并通知用户“当前时区无法识别”。

那么,我应该用什么方法来实现呢?

【问题讨论】:

【参考方案1】:

假设您的代码以所需的权限运行,并且 SetTimeZoneInformation() 由于其他原因没有返回 FALSE,那么它确实更改了系统的时区。

但是,通知区域中的时钟小程序不知道该更改,因为您一开始就忘了宣传它。引用documentation 的Remarks 部分:

要通知 Explorer 时区已更改,请发送 WM_SETTINGCHANGE 消息。

因此,当您的应用程序更改系统的时区时,您应该向所有***窗口广播WM_SETTINGCHANGE 消息。比如:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, NULL,
    SMTO_NORMAL, aShortTimeoutInMilliseconds, NULL);

【讨论】:

【参考方案2】:

您是否检查了返回代码是否有错误?从链接页面查看以下内容:

应用程序必须为此拥有SE_TIME_ZONE_NAME 权限 功能成功。默认情况下禁用此权限。使用 AdjustTokenPrivileges函数调用前开启权限 SetTimeZoneInformation,然后在 SetTimeZoneInformation 打电话。有关更多信息,请参阅运行 特殊特权。

另外,将WM_SETTINGCHANGE 作为广播消息发送以通知“托盘”(SNA)有关更改。

我知道示例代码尝试启用该权限,但它没有进行错误检查并继续调用SetTimeZoneInformation...

【讨论】:

哇,你是对的。不知何故 LookupPrivilegeValue 让我收到错误 1313。ERROR_NO_SUCH_PRIVILEGE 怎么可能? 我发现XP下不需要启用权限,这就是我收到错误的原因。现在我已将权限注释掉并添加了WM_SETTINGCHANGE 发送代码。在SetTimeZoneInformation 行之后还添加了RegFlushKey(HKEY_LOCAL_MACHINE) 行。 为什么 HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 中的 ActiveTimeBias 键没有改变? 好点,我没有看到你在原始问题中提到 XP。

以上是关于如何使用 windows api 更改时区设置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Selenium Chromedriver 中设置时区?

windows下怎样设置时区为GTM时区

如何在 Linux Time 中更改时区? [复制]

如何更改 Amazon Redshift 中的默认时区?

ms图表API。时区未更改响应

如何修改mysql url链接指定时区