我想将 Windows FILETIME 结构转换为 Unix Epoch 格式,反之亦然。我需要写两个函数:
UINT64 GetEpoch(FILETIME ft)
{
UINT64 llEpoch;
//Code that converts ft to epoch
return llEpoch;
}
FILETIME GetFileTime(UINT64 llEpoch)
{
FILETIME ft;
//Code that converts epoch to FILETIME
return ft;
}
纪元值必须以毫秒为单位。我已经尝试过这篇文章
在 Unix/Linux 中将 Windows 文件时间转换为秒
我已经使用上面的文章编写了将 Epoch 转换为 FILETIME 的函数。看起来像这样:
#define MILI_SEC_TO_UNIX_EPOCH 116444736000000000LL
FILETIME CTimeUtils::MillisToFileTime(UINT64 millis)
{
UINT64 multiplier = 10000;
UINT64 t = (multiplier * millis) + MILI_SEC_TO_UNIX_EPOCH;
ULARGE_INTEGER li;
li.QuadPart = t;
// NOTE, DON'T have to do this any longer because we're putting
// in the 64bit UINT directly
//li.LowPart = static_cast<DWORD>(t & 0xFFFFFFFF);
//li.HighPart = static_cast<DWORD>(t >> 32);
FILETIME ft;
ft.dwLowDateTime = li.LowPart;
ft.dwHighDateTime = li.HighPart;
return ft;
}
但我还没弄清楚如何将 FILETIME 转换为毫秒分辨率的纪元。
我知道这有点旧了。但这是转换。
GetSystemTimeAsFileTime(&fTime);
ULARGE_INTEGER ui;
ui.HighPart = fTime.dwHighDateTime;
ui.LowPart = fTime.dwLowDateTime;
long ms = (ui.QuadPart - 116444736000000000LL) / 10000000LL;