首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >昨天由SYSTEMTIME检查文件的LastWriteTime

昨天由SYSTEMTIME检查文件的LastWriteTime
EN

Stack Overflow用户
提问于 2015-03-09 11:58:40
回答 2查看 563关注 0票数 1

我想检查许多文件,其中的LastWriteTimes是相同的日期,系统的昨天或不。我的问题是如何以SYSTEMTIME格式设置昨天的日期.下面是我的代码。

代码语言:javascript
复制
    bool checkLastWriteTime(FILETIME ftLastWriteTime)
    {
        SYSTEMTIME stUTC, stLocal;
        // Convert the last-write time to local time.
        FileTimeToSystemTime(&ftLastWriteTime, &stUTC);
        SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

        // Build a string showing the date and time.
        _tprintf(TEXT("%02d/%02d/%d  %02d:%02d\n"),
            stLocal.wMonth, stLocal.wDay, stLocal.wYear,
            stLocal.wHour, stLocal.wMinute);

        SYSTEMTIME localTime;
        GetLocalTime(&localTime);

      //
      //How to get the date of yesterday from localTime?
      //

        if (stLocal.wYear == localTime.wYear && stLocal.wMonth == localTime.wMonth && stLocal.wDay == localTime.wDay)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-09 14:50:36

“昨天”是一个范围。它很容易计算何时结束,这是发生在今天上午12 :00:

代码语言:javascript
复制
SYSTEMTIME now;
GetLocalTime(&now);
SYSTEMTIME stYesterdayEnd = { now.wYear, now.wMonth, now.wDayOfWeek, now.wDay };
FILETIME ftYesterdayEnd;
SystemTimeToFileTime(&stYesterdayEnd, &ftYesterdayEnd);

在那之前24小时开始的。所以你需要从ftYesterdayEnd中减去100纳秒单位。使用FILETIME有点棘手,我们将使用LARGE_INTEGER来简化操作:

代码语言:javascript
复制
LARGE_INTEGER liYesterdayBeg = { ftYesterdayEnd.dwLowDateTime, ftYesterdayEnd.dwHighDateTime };
ULONGLONG oneday = 24ULL * 60 * 60 * 1000 * 1000 * 10;
liYesterdayBeg.QuadPart -= oneday;
FILETIME ftYesterdayBeg = { liYesterdayBeg.LowPart, liYesterdayBeg.HighPart };

现在,您可以编写函数了:

代码语言:javascript
复制
bool wasWrittenYesterday(FILETIME ftLastWriteTime)
{
    // As above
    //...
    return ftLastWriteTime >= ftYesterdayBeg && ftLastWriteTime < ftYesterdayEnd
}
票数 1
EN

Stack Overflow用户

发布于 2015-03-09 14:57:07

您需要将SYSTEMTIME转换为FILETIME,然后减去日期,然后再转换为SYSTEMTIME。

就像这样:

代码语言:javascript
复制
FILETIME ft;
ULARGE_INTEGER uli;
__int64 oneDay;

GetLocalTime(&localTime);
SystemTimeToFileTime(&localTime, &ft);
memcpy(&uli, (ULARGE_INTEGER *)&ft, sizeof(ULARGE_INTEGER));

// get one day in 100ns parts
oneDay = (__int64)10 * (__int64)1000 * (__int64)1000;
oneDay *= (__int64)60 * (__int64)60 * (__int64)24;

// subtract one day 
uli.QuadPart -= oneDay;

FileTimeToSystemTime((LPFILETIME)&uli, &localTime);

运行此代码后,localTime现在包含- 24小时。

参见系统引用中的备注

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28941474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档