我正在尝试使用Windows设备中的C设置时区信息。
以下是我尝试过的代码。我能够获取时区信息。尝试设置时区信息时,我的代码会运行而不会出错。但是,当我在控制面板中检查时区信息时 - >它说的日期/时间:
无法识别您当前的时区。请选择一个有效的时区。
请帮助我做错的地方:
#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);
wprintf(L"%s\n", tziOld.DaylightName);
}
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"India Standard Time");
tziNew.StandardDate.wMonth = 10;
tziNew.StandardDate.wDayOfWeek = 0;
tziNew.StandardDate.wDay = 5;
tziNew.StandardDate.wHour = 2;
StringCchCopy(tziNew.DaylightName, 32, L"India Summer Time");
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;
}