5

FILETIME を秒に変換するにはどうすればよいですか? 2 つの 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
}

これは、1 秒未満の精度で 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 に答える