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 |