检查文件的上次写入时间是昨天由系统时间

check file's LastWriteTime is yesterday by SYSTEMTIME

本文关键字:时间 昨天 系统 文件 检查      更新时间:2023-10-16

我想检查很多文件,这些文件的LastWriteTime是否与系统昨天的日期相同。我的问题是如何以 SYSTEMTIME 格式设置昨天的日期时间。以下是我的代码。

    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:%02dn"),
            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;
        }
    }
"

Yesterday"是一个范围。 很容易计算它何时结束,发生在今天早上 12 点:

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来简化它:

LARGE_INTEGER liYesterdayBeg = { ftYesterdayEnd.dwLowDateTime, ftYesterdayEnd.dwHighDateTime };
ULONGLONG oneday = 24ULL * 60 * 60 * 1000 * 1000 * 10;
liYesterdayBeg.QuadPart -= oneday;
FILETIME ftYesterdayBeg = { liYesterdayBeg.LowPart, liYesterdayBeg.HighPart };

现在,您已准备好编写函数:

bool wasWrittenYesterday(FILETIME ftLastWriteTime)
{
    // As above
    //...
    return ftLastWriteTime >= ftYesterdayBeg && ftLastWriteTime < ftYesterdayEnd
}

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

像这样:

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 小时。

另请参阅系统时间参考中的备注