吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1347|回复: 12
收起左侧

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

[复制链接]
Rodriguezs 发表于 2023-4-13 01:52
[C++] 纯文本查看 复制代码
#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;
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
daoye9988 + 1 + 1 热心回复!
为之奈何? + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

崔斯特 发表于 2023-4-13 04:04
本帖最后由 崔斯特 于 2023-4-13 04:06 编辑

首先,GetSystemTime(&stLastBootTime); 这里获取的是国际时间,而不是你开机的时间,然后,GetLocalTime(&stCurrentTime); 这里获取的是本地北京时间,所以结果最后是8h,与开机什么时间毫无关系,开机时间可以用GetTickCount();
例子:
#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;
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
simonqian + 1 + 1 用心讨论,共获提升!
shaunkelly + 1 + 1 热心回复!

查看全部评分

daoye9988 发表于 2023-4-13 07:31
一只大菜猫 发表于 2023-4-13 08:29
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 编辑

[C++] 纯文本查看 复制代码
#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
直接查询开机时间,然后自己算呗
[Shell] 纯文本查看 复制代码
systeminfo | findstr "系统启动时间:"
cnwutianhao 发表于 2023-4-13 12:01
可能是因为系统休眠的影响。如果计算机处于休眠状态,GetTickCount64 函数返回的时间会停止计数,从而导致计算结果不准确。为了避免这种情况,可以在调用 GetTickCount64 函数之前先调用一次,然后再计算时间差。这样可以抵消系统休眠对计算结果的影响。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表