Función SetTimeZoneInformation (timezoneapi.h)

Establece la configuración de zona horaria actual. Esta configuración controla las traducciones de la hora universal coordinada (UTC) a la hora local.

Para admitir límites para el horario de verano que cambie de año a año, use la función SetDynamicTimeZoneInformation .

Sintaxis

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

Parámetros

[in] lpTimeZoneInformation

Puntero a una estructura TIME_ZONE_INFORMATION que contiene la nueva configuración.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.

Comentarios

Una aplicación debe tener el privilegio SE_TIME_ZONE_NAME para que esta función se realice correctamente. Este privilegio está deshabilitado de forma predeterminada. Use la función AdjustTokenPrivileges para habilitar el privilegio antes de llamar a SetTimeZoneInformation y, a continuación, para deshabilitar el privilegio después de la llamada a SetTimeZoneInformation . Para más información, consulte Ejecución con privilegios especiales.

Windows Server 2003 y Windows XP/2000: La aplicación debe tener el privilegio SE_SYSTEMTIME_NAME.

Importante

A partir de Windows Vista y Windows Server 2008 a través de todas las versiones actuales de Windows, llame a SetDynamicTimeZoneInformation en lugar de SetTimeZoneInformation para establecer la información de zona horaria del sistema. SetDynamicTimeZoneInformation admite el historial completo de cambios en el horario estándar y el horario de verano proporcionados por los datos dinámicos en el registro de Windows. Si una aplicación usa SetTimeZoneInformation, la compatibilidad dinámica con el horario de verano está deshabilitada para el sistema y el mensaje "La zona horaria actual no se reconoce. Seleccione una zona horaria válida." aparecerá al usuario en la configuración de zona horaria de Windows.

Para informar al Explorador de que la zona horaria ha cambiado, envíe el mensaje WM_SETTINGCHANGE .

Todas las traducciones entre utc y hora local se basan en la fórmula siguiente:

UTC = hora local + sesgo

El sesgo es la diferencia, en minutos, entre la hora UTC y la hora local.

Ejemplos

En el ejemplo siguiente se muestra la zona horaria actual y, a continuación, se ajusta la zona horaria de una zona oeste. Se muestran los nombres de zona horaria antiguos y nuevos. También puede comprobar los cambios mediante fecha y hora en Panel de control. El nuevo nombre se muestra en la pestaña Fecha&hora como zona horaria actual. La nueva zona horaria se muestra en la lista desplegable de la pestaña Zona horaria . Para deshacer estos cambios, simplemente elija la zona horaria antigua en la lista desplegable.

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

Requisitos

   
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado timezoneapi.h (incluya Windows.h)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

Funciones de hora