setTimeZoneInformation 函数 (timezoneapi.h)
设置当前时区设置。 这些设置控制从协调世界时 (UTC) 到本地时间的转换。
若要支持夏令时边界,该边界因年份而变化,请使用 SetDynamicTimeZoneInformation 函数。
语法
BOOL SetTimeZoneInformation(
[in] const TIME_ZONE_INFORMATION *lpTimeZoneInformation
);
参数
[in] lpTimeZoneInformation
指向包含新设置 的TIME_ZONE_INFORMATION 结构的指针。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
应用程序必须具有SE_TIME_ZONE_NAME特权才能使此函数成功。 默认情况下,此权限处于禁用状态。 使用 AdjustTokenPrivileges 函数在调用 SetTimeZoneInformation 之前启用特权,然后在 SetTimeZoneInformation 调用后禁用该特权。 有关详细信息,请参阅使用特殊特权运行。
Windows Server 2003 和 Windows XP/2000: 应用程序必须具有SE_SYSTEMTIME_NAME特权。
重要
从 Windows Vista 和 Windows Server 2008 到所有当前版本的 Windows,调用 SetDynamicTimeZoneInformation 而不是 SetTimeZoneInformation 来设置系统时区信息。 SetDynamicTimeZoneInformation 支持 Windows 注册表中的动态数据提供的标准时间和夏令时更改的完整历史记录。 如果应用程序使用 SetTimeZoneInformation,系统将禁用动态夏令时支持,并显示消息“无法识别当前时区。 请选择有效的时区。“将在 Windows 时区设置中向用户显示。
若要通知 Explorer 时区已更改,请发送 WM_SETTINGCHANGE 消息。
UTC 和本地时间之间的所有转换都基于以下公式:
UTC = 本地时间 + 偏差
偏差是 UTC 和本地时间之间的差异(以分钟为单位)。
示例
以下示例显示当前时区,然后将时区调整为西一个区域。 将显示新旧时区名称。 还可以使用 控制面板 中的日期和时间来验证更改。 新名称在“ 日期&时间 ”选项卡上显示为“ 当前时区”。 新时区显示在“ 时区 ”选项卡上的下拉列表中。若要撤消这些更改,只需从下拉列表中选择旧时区。
#define UNICODE 1
#define _UNICODE 1
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <strsafe.h>
int main()
{
TIME_ZONE_INFORMATION tziOld, tziNew, tziTest;
DWORD dwRet;
// Enable the required privilege
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_TIME_ZONE_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
// Retrieve the current time zone information
dwRet = GetTimeZoneInformation(&tziOld);
if(dwRet == TIME_ZONE_ID_STANDARD || dwRet == TIME_ZONE_ID_UNKNOWN)
wprintf(L"%s\n", tziOld.StandardName);
else if( dwRet == TIME_ZONE_ID_DAYLIGHT )
wprintf(L"%s\n", tziOld.DaylightName);
else
{
printf("GTZI failed (%d)\n", GetLastError());
return 0;
}
// Adjust the time zone information
ZeroMemory(&tziNew, sizeof(tziNew));
tziNew.Bias = tziOld.Bias + 60;
StringCchCopy(tziNew.StandardName, 32, L"Test Standard Zone");
tziNew.StandardDate.wMonth = 10;
tziNew.StandardDate.wDayOfWeek = 0;
tziNew.StandardDate.wDay = 5;
tziNew.StandardDate.wHour = 2;
StringCchCopy(tziNew.DaylightName, 32, L"Test Daylight Zone");
tziNew.DaylightDate.wMonth = 4;
tziNew.DaylightDate.wDayOfWeek = 0;
tziNew.DaylightDate.wDay = 1;
tziNew.DaylightDate.wHour = 2;
tziNew.DaylightBias = -60;
if( !SetTimeZoneInformation( &tziNew ) )
{
printf("STZI failed (%d)\n", GetLastError());
return 0;
}
// Retrieve and display the newly set time zone information
dwRet = GetTimeZoneInformation(&tziTest);
if(dwRet == TIME_ZONE_ID_STANDARD || dwRet == TIME_ZONE_ID_UNKNOWN)
wprintf(L"%s\n", tziTest.StandardName);
else if( dwRet == TIME_ZONE_ID_DAYLIGHT )
wprintf(L"%s\n", tziTest.DaylightName);
else printf("GTZI failed (%d)\n", GetLastError());
// Disable the privilege
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
return 1;
}
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | timezoneapi.h (包括 Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |