简介
在对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 <winsock.h>中有定义,如果提示重复定义,可直接使用该头文件。
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;
}