Поделиться через


Функция 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.

Чтобы сообщить Обозреватель об изменении часового пояса, отправьте 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
Header timezoneapi.h (включая Windows.h)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

Функции времени