Windows 下使用struct timeval、gettimeofday以及localtime_r

简介

在对Unix代码迁移至Windows时,会涉及到系统函数不通用的时候,这时候就需要对其进行实现。

struct timeval 、localtime_r()和gettimeofday() 函数是Unix或Linux操作系统的API,但可以通过Windows SDK中的替代API GetSystemTimeAsFileTime() 来实现类似的功能。

struct timeval

struct timeval 结构体是 POSIX 标准中定义的一种用于表示时间的数据类型,Windows操作系统没有原生支持该数据类型。不过,可以自己定义一个类似 struct timeval 的数据结构,来存储时间值。以下是一个示例代码,展示了如何定义类似 struct timeval 的数据结构:

struct timeval
{
    long tv_sec;     // 秒
    long tv_usec;    // 微秒
};

这个结构体在头文件#include 中有定义,如果提示重复定义,可直接使用该头文件。

gettimeofday

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
	// 定义FILETIME结构体
	FILETIME ft;
	// 获取当前系统时间
	GetSystemTimeAsFileTime(&ft);

	// 将FILETIME结构体中的时间值转换为64位整数,单位为100纳秒
	ULARGE_INTEGER uliTime;
	uliTime.LowPart = ft.dwLowDateTime;
	uliTime.HighPart = ft.dwHighDateTime;
	uint64_t ullTime = uliTime.QuadPart;

	// 将时间值转换为自1970年1月1日00:00:00 UTC以来经过的微秒数
	static const uint64_t EPOCH_DIFFERENCE = 116444736000000000ULL;
	ullTime -= EPOCH_DIFFERENCE;
	ullTime /= 10;

	// 将时间值转换为struct timeval结构体
	tv->tv_sec = ullTime / 1000000;
	tv->tv_usec = ullTime % 1000000;

	return 0;
}

localtime_r

struct tm* localtime_r(const time_t* timep, struct tm* result)
{
	// 调用 localtime() 函数获取本地时间
	struct tm* tmp = localtime(timep);

	// 将 localtime() 函数返回的结果复制到 result 中
	if (tmp != nullptr)
	{
		memcpy(result, tmp, sizeof(struct tm));
	}

	return tmp;
}

你可能感兴趣的:(c++,struct,timeval,gettimeofday,localtime_r)