【问题标题】:c++ \ Convert FILETIME to secondsc++\将FILETIME转换为秒
【发布时间】:2013-11-11 15:21:06
【问题描述】:

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

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

 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... 这是提取秒数的好方法吗?

【问题讨论】:

  • 您如何比较 FILETIME 对象?而不是比较两个不同的变量,为什么不尝试通过输出格式化的 FILETIME 变量来检查转换代码,然后将相同的 FILETIME 变量转换为 time_t 并输出(格式化的)结果。应该没有区别(除了精度损失)。
  • 我没有 C++ 背景我希望我知道怎么做。我会添加完整的代码,你会决定的。。

标签: c++ windows comparison filetime


【解决方案1】:

您提供的代码似乎是正确的,它将 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 年以来的秒数为单位),分辨率为亚秒级。

【讨论】:

  • 当我得到 NOW 日期时,我想它可能不包括我的时区 (+02:00)?
  • 是的,我的 time_d() 代码也仅在 Windows 上运行...关于其他评论,确实可能是时区问题。您是否使用相同的功能获取时间戳?
  • 您似乎没有自己认为的时间。作为一种调试措施,尝试将两个 FILETIME 结构都转换为 SYSTEMTIME 结构,并查看时间实际相差多远。
  • 其实,你的代码中是如何获取当地时间的呢?确保您以 UTC 而非本地时间的形式获取它(例如,如果您使用 GetLocalTime(),则它应该是 GetSystemTime()),否则会因时区而有所不同(文件时间以 UTC 为单位)。
【解决方案2】:

为了比较

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

是最简单的。

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2020-01-11
    • 2014-10-03
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多