检查文件的上次写入时间是昨天由系统时间
check file's LastWriteTime is yesterday by SYSTEMTIME
我想检查很多文件,这些文件的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 小时。
另请参阅系统时间参考中的备注
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- KMP算法和LPS表构造的运行时间
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 检查文件的上次写入时间是昨天由系统时间