Rodriguezs 发表于 2023-4-13 01:52

请问计算上次关机距今多久的代码,哪里有问题,为什么不太准?

#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:04

本帖最后由 崔斯特 于 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;
}
```

daoye9988 发表于 2023-4-13 07:31

确实两个时间不一样

一只大菜猫 发表于 2023-4-13 08:29

你函数用错了,应该用GetTickCount()

boxer 发表于 2023-4-13 08:36

应该没有可以直接获取上次关机的时间吧?
只能通过查询日志的方式, 也不一定准确

xlhwxyh 发表于 2023-4-13 08:38

不知道怎么查询上次关机时间

Coling 发表于 2023-4-13 09:17

如果系统时间和当前时间不同,你需要相应地更改代码以反映这种情况。以下是一些可能需要修改的代码:
将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:24

本帖最后由 麋鹿啊 于 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

rhci 发表于 2023-4-13 11:40

直接查询开机时间,然后自己算呗
systeminfo | findstr "系统启动时间:"

cnwutianhao 发表于 2023-4-13 12:01

可能是因为系统休眠的影响。如果计算机处于休眠状态,GetTickCount64 函数返回的时间会停止计数,从而导致计算结果不准确。为了避免这种情况,可以在调用 GetTickCount64 函数之前先调用一次,然后再计算时间差。这样可以抵消系统休眠对计算结果的影响。
页: [1] 2
查看完整版本: 请问计算上次关机距今多久的代码,哪里有问题,为什么不太准?