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