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);


发布评论