Partager via


SetTimeZoneInformation, fonction (timezoneapi.h)

Définit les paramètres actuels du fuseau horaire. Ces paramètres contrôlent les traductions du temps universel coordonné (UTC) vers l’heure locale.

Pour prendre en charge les limites de l’heure d’été qui changent d’une année à l’autre, utilisez la fonction SetDynamicTimeZoneInformation .

Syntaxe

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

Paramètres

[in] lpTimeZoneInformation

Pointeur vers une structure TIME_ZONE_INFORMATION qui contient les nouveaux paramètres.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Une application doit disposer du privilège SE_TIME_ZONE_NAME pour que cette fonction réussisse. Ce privilège est désactivé par défaut. Utilisez la fonction AdjustTokenPrivileges pour activer le privilège avant d’appeler SetTimeZoneInformation, puis pour désactiver le privilège après l’appel SetTimeZoneInformation . Pour plus d’informations, consultez Exécution avec des privilèges spéciaux.

Windows Server 2003 et Windows XP/2000 : L’application doit disposer du privilège SE_SYSTEMTIME_NAME.

Important

À compter de Windows Vista et Windows Server 2008 jusqu’à toutes les versions actuelles de Windows, appelez SetDynamicTimeZoneInformation au lieu de SetTimeZoneInformation pour définir les informations de fuseau horaire système. SetDynamicTimeZoneInformation prend en charge l’historique complet des modifications apportées à l’heure standard et à l’heure d’été fournies par les données dynamiques dans le Registre Windows. Si une application utilise SetTimeZoneInformation, la prise en charge de l’heure d’été dynamique est désactivée pour le système et le message « Votre fuseau horaire actuel n’est pas reconnu. Sélectionnez un fuseau horaire valide. » s’affiche à l’utilisateur dans les paramètres du fuseau horaire Windows.

Pour informer Explorer que le fuseau horaire a changé, envoyez le message WM_SETTINGCHANGE.

Toutes les traductions entre l’heure UTC et l’heure locale sont basées sur la formule suivante :

UTC = heure locale + biais

Le biais est la différence, en minutes, entre l’heure UTC et l’heure locale.

Exemples

L’exemple suivant affiche le fuseau horaire actuel, puis ajuste le fuseau horaire d’une zone ouest. L’ancien et le nouveau nom des fuseaux horaires s’affichent. Vous pouvez également vérifier les modifications à l’aide de Date et Heure dans Panneau de configuration. Le nouveau nom s’affiche sous l’onglet Date&Heure en tant que Fuseau horaire actuel. Le nouveau fuseau horaire s’affiche dans la liste déroulante sous l’onglet Fuseau horaire . Pour annuler ces modifications, choisissez simplement votre ancien fuseau horaire dans la liste déroulante.

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

Configuration requise

   
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête timezoneapi.h (inclure Windows.h)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

Fonctions de temps