5

如何将 FILETIME 转换为秒?我需要比较两个 FILETIME 对象..

我找到了这个,但似乎它不起作用......

 ULARGE_INTEGER ull;
    ull.LowPart = lastWriteTimeLow1;
    ull.HighPart = lastWriteTimeHigh1;
    time_t lastModified =  ull.QuadPart / 10000000ULL - 11644473600ULL;

    ULARGE_INTEGER xxx;
    xxx.LowPart = currentTimeLow1;
    xxx.HighPart = currentTimeHigh1;
    time_t current =  xxx.QuadPart / 10000000ULL - 11644473600ULL;

    unsigned long SecondsInterval = current - lastModified;

    if (SecondsInterval > RequiredSecondsFromNow)
        return true;

    return false;

我比较了 2 FILETIME 和 10 秒的预期差异,它给了我 ~7000 ......这是提取秒数的好方法吗?

4

2 回答 2

5

您提供的代码似乎是正确的,它将 FILETIME 转换为 UNIX 时间戳(显然会丢失精度,因为 FILETIME 的理论分辨率为 100 纳秒)。您确定您比较的 FILETIME 确实只有 10 秒的差异吗?

我实际上在某些软件中使用了非常相似的代码:

double time_d()
{
  FILETIME ft;
  GetSystemTimeAsFileTime(&ft);
  __int64* val = (__int64*) &ft;
  return static_cast<double>(*val) / 10000000.0 - 11644473600.0;   // epoch is Jan. 1, 1601: 134774 days to Jan. 1, 1970
}

这将返回具有亚秒级分辨率的类 UNIX 时间戳(以 1970 年以来的秒数为单位)。

于 2013-10-31T14:52:10.493 回答
0

为了比较

double toSeconds(const FILETIME& t)
{
    return LARGE_INTEGER{t.dwLowDateTime, (long)t.dwHighDateTime}.QuadPart * 1e-7;
}

是最简单的。

于 2020-11-12T10:49:26.933 回答