C++获取系统启动时间

这里写自定义目录标题

这里写自定义目录标题

获取系统启动时间

转换时间戳

code

cpp 复制代码
#include<stdio.h> 
#include<windows.h>  
#include <ctime>

#include <iostream>
#define NT_SUCCESS(x) ((x)>=0) 
const UINT SystemTimeInformation = 3;

typedef struct {
	LARGE_INTEGER liKeBootTime;
	LARGE_INTEGER liKeSystemTime;
	LARGE_INTEGER liExpTimeZoneBias;
	ULONG uCurrentTimeZoneId;
	DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;

typedef long(__stdcall *fnNtQuerySystemInformation)(
	IN  UINT SystemInformationClass,
	OUT PVOID SystemInformation,
	IN  ULONG SystemInformationLength,
	OUT PULONG ReturnLength OPTIONAL);

static fnNtQuerySystemInformation NtQuerySystemInformation = NULL;

int main(void)
{
	NtQuerySystemInformation = (fnNtQuerySystemInformation)GetProcAddress(LoadLibrary("ntdll.dll"),
		"NtQuerySystemInformation");
	if (NtQuerySystemInformation == NULL)
	{
		printf("Get NtQuerySystemInformation Addr Failed,err=%u\n", GetLastError());
		return 0;
	}
	LONG status;
	SYSTEM_TIME_INFORMATION sti;
	status = NtQuerySystemInformation(SystemTimeInformation, &sti, sizeof(sti), 0);
	if (NO_ERROR != status)
	{
		printf("NtQuerySystemInformation Failed!n");
		return 0;
	}
	FILETIME ft1, ft2;
	SYSTEMTIME st;
	memcpy_s(&ft1, sizeof(ft1), &sti.liKeBootTime, sizeof(sti.liKeBootTime));
	//将其转为文件时间  
	//将一个FILETIME结构转换成本地时间  
	if (0 == FileTimeToLocalFileTime(&ft1, &ft2))
	{
		printf("FileTimeToLocalFileTime Failed err=%u\nn", GetLastError());
		return 0;
	}
	//将文件时间转为系统时间
	if (0 == FileTimeToSystemTime(&ft2, &st))
	{
		printf("FileTimeToSystemTimeFailed err=%u\nn", GetLastError());
		return 0;
	}
	printf("Date: %02d-%02d-%04d Time: %02d:%02d:%02d \n", st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond);



	LARGE_INTEGER li;
	li.LowPart = ft1.dwLowDateTime;
	li.HighPart = ft1.dwHighDateTime;

	// 需要对LARGE_INTEGER结构的值进行校正,因为FILETIME以100纳秒为单位,
	// 而Unix时间戳以秒为单位。同时需要考虑从1601年1月1日到1970年1月1日的时间偏移。
	li.QuadPart -= 116444736000000000ULL; // 116444736000000000 = 100纳秒 * (3600 * 24 * 365 * 30 + 3600 * 24 * 15)
	LONG64 timestamp = (LONG64)(li.QuadPart / 10000000); // 
	printf("Unix timestamp: %ld\n", timestamp);





	// 计算时间戳
	FILETIME epoch;
	ZeroMemory(&epoch, sizeof(FILETIME));
	SYSTEMTIME stEpoch = { 1970, 1, 0, 1, 0, 0, 0, 0 };
	SystemTimeToFileTime(&stEpoch, &epoch);

	ULARGE_INTEGER ullBootTime;
	ULARGE_INTEGER ullEpoch;
	ullBootTime.LowPart = ft2.dwLowDateTime;
	ullBootTime.HighPart = ft2.dwHighDateTime;
	ullEpoch.LowPart = epoch.dwLowDateTime;
	ullEpoch.HighPart = epoch.dwHighDateTime;

	// 计算时间戳(单位:秒)
	LONG64 nSysStartRunTime = static_cast<LONG64>((ullBootTime.QuadPart - ullEpoch.QuadPart) / 10000000);
	std::cout << "系统启动时间: " << nSysStartRunTime << std::endl;

	getchar();
	return 0;
}
相关推荐
学传打活13 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活18 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng1681 个月前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心1 个月前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055271 个月前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055271 个月前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝1 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055271 个月前
Java图像处理实战指南
人工智能·1024程序员节
u0103055271 个月前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节