2024年4月12日发(作者:)

C++获取和设置时区

学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快

速成为做挂达人。

一、获取当前系统时区信息

使用API函数GetTimeZoneInformation可以获得当前时区的相关信息,函数原型为

DWORDGetTimeZoneInformation(

LPTIME_ZONE_INFORMATIONlpTimeZoneInformation);

需要传递一个TIME_ZONE_INFORMATION结构体指针,此结构体定义为

typedefstruct_TIME_ZONE_INFORMATION{

LONGBias;//以分钟为单位

WCHARStandardName[32];//标准时间的名称

SYSTEMTIMEStandardDate;

LONGStandardBias;

WCHARDaylightName[32];//夏令时的名称

SYSTEMTIMEDaylightDate;

LONGDaylightBias;

}TIME_ZONE_INFORMATION,*PTIME_ZONE_INFORMATION,*LPTIME_ZONE_INFORMATION;

其中UTC=localtime+bias(UTC时间=本地时间+bias),具体含义参看MSDN

例子:

CStringGetTimeZoneNow()

{

TIME_ZONE_INFORMATIONtzi;

GetSystemTime(

GetTimeZoneInformation(

CString

CString

strStandName=

=

rdName;

htName;strDaylightName

intzone=/-60;//时区,如果是中国标准时间则得到8

returnstrStandName;

}

二、设置时区

可以使用API函数SetTimeZoneInformation设置时区,函数原型为

BOOLSetTimeZoneInformation(

constTIME_ZONE_INFORMATION*lpTimeZoneInformation

);

同样需要TIME_ZONE_INFORMATION结构体,不过这是设置时区,所以我们要为这个结构

体设置相应的值,我们可以在注册表

HKEY_LOCAL_MACHINE"SOFTWARE"Microsoft"WindowsNT"CurrentVersion"TimeZones

下得到所有的时区信息,(如果不想每次都查注册表获得时区列表,可以讲时区列表保

存至XML或其他文件中)

以中国北京时间为例即ChinaStandardTime子项,

Display:在控制面板中调整时区时显示的名称

Std:标准时间名称

Dlt:如果有夏令时时区则为其名称。

Tzi:一个数据结构,包含本地时区和0时区相差的分钟数等信息。二进制形式存储的

用一结构体定义之

typedefstruct_REG_TZI_FORMAT

{

LONGBias;

LONGStandardBias;

LONGDaylightBias;

SYSTEMTIMEStandardDate;

SYSTEMTIMEDaylightDate;

}REG_TZI_FORMAT;

例子:(上面的结构体定义不要忘记加入代码)

BOOLCSetTimeZone(CStringsubKey)

{

//获得权限

HANDLEhToken;

TOKEN_PRIVILEGEStkp;

OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,

LookupPrivilegeValue(NULL,TEXT("SeTimeZonePrivilege"),

egeCount=1;

eges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken,FALSE,0,(PTOKEN_PRIVILEGES)NULL,0);

HKEYhKey;

TIME_ZONE_INFORMATIONtziNew;

REG_TZI_FORMATregTZI;

DWORDdwBufLen=sizeof(regTZI);

LONGlRet;

CStringkeyName=_T("Software""Microsoft""WindowsNT""CurrentVersion""Time

Zones""")+subKey;

CStringstrStd=_T("");//标准时间名称

CStringstrDlt=_T("");//夏令时名称

unsignedcharszData[256];

DWORDdwDataType,dwBufSize;

dwBufSize=256;

lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName,

if(lRet!=ERROR_SUCCESS)

returnFALSE;

lRet=RegQueryValueEx(hKey,TEXT("TZI"),NULL,NULL,(LPBYTE)

if(RegQueryValueEx(hKey,_T("Dlt"),0,

strDlt=(LPCTSTR)szData;

dwBufSize=256;

if(RegQueryValueEx(hKey,_T("Std"),0,

strStd=(LPCTSTR)szData;

RegCloseKey(hKey);

if((lRet!=ERROR_SUCCESS)||(dwBufLen>sizeof(regTZI)))

szData,==ERROR_SUCCESS)

szData,==ERROR_SUCCESS)

0,KEY_QUERY_VALUE,);

returnFALSE;

//设置值

ZeroMemory(sizeof(tziNew));

=;

rdDate=rdDate;

wcscpy(rdName,strStd);

wcscpy(htName,strDlt);

htDate=htDate;

htBias=htBias;

if(!SetTimeZoneInformation())

{

TRACE("Failure1:%d"n",GetLastError());

returnFALSE;

}

eges[0].Attributes=0;

AdjustTokenPrivileges(hToken,FALSE,0,(PTOKEN_PRIVILEGES)NULL,

returnTRUE;

}

调用说明:如果要设置成(GMT+05:00)叶卡捷琳堡

则为CSetTimeZone(_T(“EkaterinburgStandardTime”));

0);