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

另请参阅

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

时间函数