2013-10-31 82 views
3

如何將FILETIME轉換爲秒?我需要比較兩個FILETIME對象..C++ 將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秒diff和它給了我〜7000 ... 這是一個很好的方法來提取秒數?

+0

你如何比較FILETIME對象?而不是比較兩個不同的變量,爲什麼不嘗試通過輸出格式化的FILETIME變量來檢查轉換代碼,然後將相同的FILETIME變量轉換爲time_t並輸出(格式化的)結果。應該沒有區別(除了精度的損失)。 – gordonk

+0

我沒有C++背景我希望我知道如何做到這一點..我會添加完整的代碼,你會決定.. – user1025852

回答

4

您給出的代碼似乎是正確的,它將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 
} 

這將返回(自1970年以來秒)類似UNIX的時間戳和亞秒級的分辨率。

+0

抱歉不提及,但我的軟件只能在Windows上運行... – user1025852

+0

I當我得到NOW日期時,可能它不包括我的TimeZone(+02:00)? – user1025852

+0

是的,我的time_d()代碼也只在Windows上運行......關於另一個評論,的確它可能是一個時區問題。你是否獲得了具有相同功能的時間戳? – Ale