C++獲取和設置時區(win)

一、獲取當前系統時區信息

    使用API函數GetTimeZoneInformation可以獲得當前時區的相關信息,函數原型爲

    DWORD GetTimeZoneInformation(

    LPTIME_ZONE_INFORMATION lpTimeZoneInformation);

    需要傳遞一個TIME_ZONE_INFORMATION 結構體指針,此結構體定義爲

    typedef struct _TIME_ZONE_INFORMATION {

    LONG Bias;//以分鐘爲單位

    WCHAR StandardName[ 32 ];//標準時間的名稱

    SYSTEMTIME StandardDate;

    LONG StandardBias;

    WCHAR DaylightName[ 32 ];//夏令時的名稱

    SYSTEMTIME DaylightDate;

    LONG DaylightBias;

    } TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;

    其中UTC = local time + bias(UTC時間 = 本地時間 + bias),具體含義參看MSDN

    例子:

    CString GetTimeZoneNow()

    {

    TIME_ZONE_INFORMATION tzi;

    GetSystemTime(

    GetTimeZoneInformation(

    CString  strStandName  =  tzi.StandardName;

    CString  strDaylightName  =  tzi.DaylightName;

    int zone = tzi.Bias/ -60; //時區,如果是中國標準時間則得到8

    return strStandName;

    }

    二、設置時區

    可以使用API函數SetTimeZoneInformation設置時區,函數原型爲

    BOOL SetTimeZoneInformation(

    const TIME_ZONE_INFORMATION* lpTimeZoneInformation

    );

    同樣需要TIME_ZONE_INFORMATION結構體,不過這是設置時區,所以我們要爲這個結構體設置相應的值,我們可以在註冊表

    HKEY_LOCAL_MACHINE"SOFTWARE"Microsoft"Windows NT"CurrentVersion"Time Zones

    下得到所有的時區信息,(如果不想每次都查註冊表獲得時區列表,可以講時區列表保存至XML或其他文件中)

    以中國北京時間爲例即 China Standard Time子項,

    Display:在控制面板中調整時區時顯示的名稱

    Std:標準時間名稱

    Dlt: 如果有夏令時時區則爲其名稱。

    Tzi: 一個數據結構,包含本地時區和0時區相差的分鐘數等信息。二進制形式存儲的

    用一結構體定義之

    typedef struct _REG_TZI_FORMAT

    {

    LONG Bias;

    LONG StandardBias;

    LONG DaylightBias;

    SYSTEMTIME StandardDate;

    SYSTEMTIME DaylightDate;

    } REG_TZI_FORMAT;

    例子:(上面的結構體定義不要忘記加入代碼)

    BOOL CSetTimeZone(CString subKey)

    {

    //獲得權限

    HANDLE hToken;

    TOKEN_PRIVILEGES tkp;

    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,

    LookupPrivilegeValue(NULL, TEXT("SeTimeZonePrivilege"),

    tkp.PrivilegeCount = 1;

    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

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

    HKEY hKey;

    TIME_ZONE_INFORMATION tziNew;

    REG_TZI_FORMAT regTZI;

    DWORD dwBufLen=sizeof(regTZI);

    LONG lRet;

    CString keyName = _T("Software""Microsoft""Windows NT""CurrentVersion""Time Zones""")+ subKey;

    CString strStd = _T("");//標準時間名稱

    CString strDlt = _T("");//夏令時名稱

    unsigned char szData[256];

    DWORD dwDataType, dwBufSize;

    dwBufSize = 256;

    lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName,    0, KEY_QUERY_VALUE,  );

    if( lRet != ERROR_SUCCESS )

    return FALSE;

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

    if(RegQueryValueEx(hKey, _T("Dlt"), 0,  szData,  == ERROR_SUCCESS)

    strDlt =(LPCTSTR)szData;

    dwBufSize = 256;

    if(RegQueryValueEx(hKey, _T("Std"), 0,  szData,  == ERROR_SUCCESS)

    strStd =(LPCTSTR)szData;

    RegCloseKey(hKey);

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

    return FALSE;

    //設置值

    ZeroMemory(sizeof(tziNew));

    tziNew.Bias = regTZI.Bias;

    tziNew.StandardDate = regTZI.StandardDate;

    wcscpy(tziNew.StandardName, strStd);

    wcscpy(tziNew.DaylightName, strDlt);

    tziNew.DaylightDate = regTZI.DaylightDate;

    tziNew.DaylightBias = regTZI.DaylightBias;

    if( !SetTimeZoneInformation(  ) )

    {

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

    return FALSE;

    }

    tkp.Privileges[0].Attributes = 0;

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

    return TRUE;

    }

    調用說明:如果要設置成(GMT+05:00)葉卡捷琳堡

    則爲 CSetTimeZone(_T(“Ekaterinburg Standard Time”));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章