zoukankan      html  css  js  c++  java
  • 系统开机时间、关机时间的获取

    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;
    }
  • 相关阅读:
    Tornado入门2
    Tornado框架入门
    Nginx下载及安装
    串口通信工程笔记一
    串口通信工程笔记之协议设计
    串口通信之并发与单步
    串口通信属性及事件解析
    串口通信之超时
    VC程序Debug版本和Release版本运行不一致问题
    串口通信之DataReceive事件触发时机
  • 原文地址:https://www.cnblogs.com/rainduck/p/3040563.html
Copyright © 2011-2022 走看看