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