Condividi tramite


Funzione SetTimeZoneInformation (timezoneapi.h)

Imposta le impostazioni correnti del fuso orario. Queste impostazioni controllano le traduzioni dall'ora UTC (Coordinated Universal Time) all'ora locale.

Per supportare i limiti per l'ora legale che cambiano da anno a anno, usare la funzione SetDynamicTimeZoneInformation .

Sintassi

BOOL SetTimeZoneInformation(
  [in] const TIME_ZONE_INFORMATION *lpTimeZoneInformation
);

Parametri

[in] lpTimeZoneInformation

Puntatore a una struttura TIME_ZONE_INFORMATION che contiene le nuove impostazioni.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è diverso da zero.

Se la funzione ha esito negativo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.

Commenti

Affinché questa funzione abbia esito positivo, è necessario che un'applicazione disponga del privilegio SE_TIME_ZONE_NAME. Questo privilegio è disabilitato per impostazione predefinita. Usare la funzione AdjustTokenPrivileges per abilitare il privilegio prima di chiamare SetTimeZoneInformation e quindi disabilitare il privilegio dopo la chiamata a SetTimeZoneInformation . Per altre informazioni, vedere Esecuzione con privilegi speciali.

Windows Server 2003 e Windows XP/2000: L'applicazione deve avere il privilegio SE_SYSTEMTIME_NAME.

Importante

A partire da Windows Vista e Windows Server 2008 tramite tutte le versioni correnti di Windows, chiama SetDynamicTimeZoneInformation anziché SetTimeZoneInformation per impostare le informazioni sul fuso orario di sistema. SetDynamicTimeZoneInformation supporta la cronologia completa delle modifiche apportate all'ora solare e all'ora legale fornite dai dati dinamici nel Registro di sistema di Windows. Se un'applicazione usa SetTimeZoneInformation, il supporto dell'ora legale dinamica è disabilitato per il sistema e il messaggio "Il fuso orario corrente non viene riconosciuto. Selezionare un fuso orario valido." verrà visualizzato all'utente nelle impostazioni del fuso orario di Windows.

Per informare Explorer che il fuso orario è stato modificato, inviare il messaggio di WM_SETTINGCHANGE .

Tutte le traduzioni tra utc e ora locale si basano sulla formula seguente:

UTC = ora locale + distorsione

La distorsione è la differenza, espressa in minuti, tra ora UTC e ora locale.

Esempio

Nell'esempio seguente viene visualizzato il fuso orario corrente, quindi viene modificato il fuso orario di un fuso occidentale. Vengono visualizzati i nomi dei fusi orari precedenti e nuovi. È anche possibile verificare le modifiche usando data e ora in Pannello di controllo. Il nuovo nome viene visualizzato nella scheda Data&ora come fuso orario corrente. Il nuovo fuso orario viene visualizzato nell'elenco a discesa della scheda Fuso orario . Per annullare queste modifiche, è sufficiente scegliere il fuso orario precedente dall'elenco a discesa.

#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;
}

Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione timezoneapi.h (include Windows.h)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

Funzioni temporali