请问计算上次关机距今多久的代码,哪里有问题,为什么不太准?
#include <iostream>#include <windows.h>
int main()
{
// 获取上一次关机时间
SYSTEMTIME stLastBootTime;
GetSystemTime(&stLastBootTime);
FILETIME ftLastBootTime;
SystemTimeToFileTime(&stLastBootTime, &ftLastBootTime);
// 获取当前时间
SYSTEMTIME stCurrentTime;
GetLocalTime(&stCurrentTime);
FILETIME ftCurrentTime;
SystemTimeToFileTime(&stCurrentTime, &ftCurrentTime);
// 计算时间差
ULARGE_INTEGER liLastBootTime = { ftLastBootTime.dwLowDateTime, ftLastBootTime.dwHighDateTime };
ULARGE_INTEGER liCurrentTime = { ftCurrentTime.dwLowDateTime, ftCurrentTime.dwHighDateTime };
ULONGLONG diff = liCurrentTime.QuadPart - liLastBootTime.QuadPart;
diff /= 10000000; // 转换为秒
// 格式化输出时间差
int hours = diff / 3600;
int minutes = (diff % 3600) / 60;
int seconds = diff % 60;
printf("%d时%d分%d秒", hours, minutes, seconds);
return 0;
} 本帖最后由 崔斯特 于 2023-4-13 04:06 编辑
首先,GetSystemTime(&stLastBootTime); 这里获取的是国际时间,而不是你开机的时间,然后,GetLocalTime(&stCurrentTime); 这里获取的是本地北京时间,所以结果最后是8h,与开机什么时间毫无关系,开机时间可以用GetTickCount();
例子:
```c
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main()
{
// 获取当前时间和系统启动时间
time_t currTime = time(NULL);
time_t bootTime = currTime - GetTickCount() / 1000;
// 计算自上次开机以来经过的时间
time_t elapsedTime = currTime - bootTime;
int days = (int) (elapsedTime / (24 * 3600));
elapsedTime = elapsedTime % (24 * 3600);
int hours = (int) (elapsedTime / 3600);
elapsedTime %= 3600;
int minutes = (int) (elapsedTime / 60);
elapsedTime %= 60;
int seconds = (int) elapsedTime;
// 输出计算机开机时间
printf("The computer has been running for %d day(s) %02d hour(s) %02d minute(s) %02d second(s)\n",
days, hours, minutes, seconds);
return 0;
}
``` 确实两个时间不一样 你函数用错了,应该用GetTickCount() 应该没有可以直接获取上次关机的时间吧?
只能通过查询日志的方式, 也不一定准确 不知道怎么查询上次关机时间
如果系统时间和当前时间不同,你需要相应地更改代码以反映这种情况。以下是一些可能需要修改的代码:
将SystemTimeToFileTime函数中的SystemTimeToFileTime改为SystemTimeToFileTime(&stCurrentTime, &ftCurrentTime),因为这个函数的参数类型是FILETIME,而不是SYSTEMTIME。
将printf函数中的%d改为%d,因为printf函数的参数类型是int。
将liLastBootTime和liCurrentTime变量的类型分别改为ULARGE_INTEGER,因为这些变量的类型在Windows API中已经定义。
将diff变量的类型改为ULONGLONG,因为这个变量的类型在Windows API中已经定义。
将hours、minutes和seconds变量的类型分别改为int,因为这些变量的类型在Windows API中已经定义。
将printf函数中的%d改为%d,因为printf函数的参数类型是int。
请注意,这只是一些可能需要修改的代码示例,具体的修改方式可能因你的具体情况而异。
————————————————————
来着国产GPT给的回复,不知道能不能帮到你 本帖最后由 麋鹿啊 于 2023-4-13 09:34 编辑
#include <iostream>
#include <windows.h>
int main()
{
ULONGLONG uptime = GetTickCount64();
int hours = uptime / 3600000;
int minutes = (uptime % 3600000) / 60000;
int seconds = (uptime % 60000) / 1000;
printf("系统已经运行了 %d时%d分%d秒", hours, minutes, seconds);
return 0;
}
来自chatgpt 直接查询开机时间,然后自己算呗
systeminfo | findstr "系统启动时间:" 可能是因为系统休眠的影响。如果计算机处于休眠状态,GetTickCount64 函数返回的时间会停止计数,从而导致计算结果不准确。为了避免这种情况,可以在调用 GetTickCount64 函数之前先调用一次,然后再计算时间差。这样可以抵消系统休眠对计算结果的影响。
页:
[1]
2