系统开机时间、关机时间的获取

1.方法

  • 开机时间:1)利用timeGetTime获取开机后到当前的毫秒数,然后转换为秒数(舍去毫秒);2)再和当前时间做差,得到Unix格式的格林威治时间。
  • 上次关机时间:保存在注册表local machine下的SYSTEM\\CurrentControlSet\\Control\\Windows中的ShutdownTime中,其值为8字节的FILETIME。

2. 参考代码

其中注释掉的部分主要为中间输出,需要的额话可以还原。

其中包含两个额外函数:time_t和FILETIME的相互转化

//参考自http://msdn.microsoft.com/en-us/library/windows/desktop/ms724228(v=vs.85).aspx

//time_t和FileTime的格式转换
void TimetToFileTime( time_t t, LPFILETIME pft )
{
    LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000;
    pft->dwLowDateTime = (DWORD) ll;
    pft->dwHighDateTime = ll >>32;
}

void  FileTimeToTimet(FILETIME ft, time_t *t )
{  
    LONGLONG ll = 0;  

    ULARGE_INTEGER ui;  
    ui.LowPart =  ft.dwLowDateTime;  
    ui.HighPart = ft.dwHighDateTime;  

    ll = ((INT64)ft.dwHighDateTime) << 32 + ft.dwLowDateTime;
    *t = (LONGLONG)(ui.QuadPart - 116444736000000000)/10000000; 


}

//返回启动时间,格林威治时间
//需要求他格式时间,可使用TimetToFileTime和FileTimeToSystemTime等函数进行转换
time_t GetBootTime(VOID)
{
    DWORD startMSCount;//从开机到现在的毫秒数
    startMSCount = timeGetTime();
    time_t CurSysTime, BootSysTime;
    time(&CurSysTime);
    //将开机到现在的毫秒数转换为秒数,再用当前的时间减去,获得开机时间
    BootSysTime = CurSysTime - startMSCount/1000;

    //struct tm tmLocalBootTime, tmGBootTime;
    ////转化为本地时间,且同时转换为结构tm
    //localtime_s(&tmLocalBootTime, &BootSysTime);

    ////转换为格林威治时间,转换为tm结构
    //gmtime_s(&tmGBootTime, &BootSysTime);
    //
    //char buf[128];
    //ZeroMemory(buf, sizeof(buf));
    ////转化为字符串 Apri 4, mon, 2012.。。。诸如此类的格式
    //asctime_s(buf, &tmLocalBootTime);
    //printf("Local BootTime :%s\n\n", buf);
    //
    //ZeroMemory(buf, sizeof(buf));
    //asctime_s(buf, &tmGBootTime);
    //printf("Global BootTime:%s\n\n", buf);
    //
    //tm结构中的year是从1900年算起,故应加上+1900
    //printf("BootTime:%4d-%02d-%02d %02d-%02d-%02d\n", 
    //    tmLocalBootTime.tm_year+1900, tmLocalBootTime.tm_mon,
    //    tmLocalBootTime.tm_mday, tmLocalBootTime.tm_hour,
    //    tmLocalBootTime.tm_min, tmLocalBootTime.tm_sec);
    return BootSysTime;
}


//获得最近一次关机时间,若为0,则失败
//返回格式为Unix时间,若需要其他格式时间请稍作修改即可
time_t GetLastShutdownTime()
{
    HKEY hKey;
    LONG lResult;
    time_t ShutdownTime = 0;
    LPTSTR lpSubKey=TEXT("SYSTEM\\CurrentControlSet\\Control\\Windows");
    lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);
    
    if (lResult != ERROR_SUCCESS)
        return ShutdownTime;
    FILETIME FileTime;
    DWORD dwSize;
    lResult = RegQueryValueEx(hKey, TEXT("ShutdownTime"), 
                                NULL, NULL, NULL, &dwSize);
    if (lResult == ERROR_SUCCESS && dwSize==sizeof(FileTime))
    {
        lResult = RegQueryValueEx(hKey, TEXT("ShutdownTime"), NULL, 
                                NULL, (LPBYTE)&FileTime, &dwSize);
        //SYSTEMTIME SystemTime;
        //FileTimeToSystemTime(&FileTime, &SystemTime);
        FileTimeToTimet(FileTime, &ShutdownTime);
        //struct tm tmShutdownTime;
        //localtime_s(&tmShutdownTime, &ShutdownTime);
        ////tm结构中的year是从1900年算起,故应加上+1900
        ////tm中德month是0~11,故应加上1
        //printf("ShutdownTime:%4d-%02d-%02d %02d:%02d:%02d\n", 
        //    tmShutdownTime.tm_year+1900, tmShutdownTime.tm_mon+1,
        //    tmShutdownTime.tm_mday, tmShutdownTime.tm_hour,
        //    tmShutdownTime.tm_min, tmShutdownTime.tm_sec);
    }
    RegCloseKey(hKey);
    return ShutdownTime;
}

 

posted on 2013-04-24 17:03  rainduck  阅读(6439)  评论(0编辑  收藏  举报

导航