30天 系统时间的差异

30 days Difference on SYSTEMTIME

本文关键字:时间 系统 30天      更新时间:2023-10-16

我愿意问是否有人有一些好的算法(或方法)来检查两个 SYSTEMTIME 变量的差异是否为 30 天或更长时间?

谢谢

正如 SYSTEMTIME 上的 MSDN 页面所说,

建议您不要在SYSTEMTIME结构中添加和减去值来获取相对时间。相反,您应该

  • SYSTEMTIME结构转换为FILETIME结构。
  • 将生成的FILETIME结构复制到ULARGE_INTEGER结构。
  • ULARGE_INTEGER值使用正常的 64 位算术。
SYSTEMTIME st1, st2;
/* ... */
FILETIME ft1, ft2;
ULARGE_INTEGER t1, t2;
ULONGLONG diff;
SystemTimeToFileTime(&st1, &ft1);
SystemTimeToFileTime(&st2, &ft2);
memcpy(&t1, &ft1, sizeof(t1));
memcpy(&t2, &ft2, sizeof(t1));
diff = (t1.QuadPart<t2.QuadPart)?(t2.QuadPart-t1.QuadPart):(t1.QuadPart-t2.QuadPart);
if(diff > (30*24*60*60)*(ULONGLONG)10000000)
{
    ...
}

(为简洁起见,省略了对SystemTimeToFileTime调用的错误处理)

关于(30*24*60*60)*(ULONGLONG)1000000030*24*60*60是 30 天内的秒数; 10000000是一秒钟内FILETIME"刻度"的数量(每个FILETIME刻度是 100 ns=10^2*10^-9 s=10^-7 s)。转换为乘法中的一个操作数是为了避免溢出常规 int s(在适合int范围的整数文本之间执行运算时的默认值)。

我会将它们转换为FileTime并从另一个中减去一个。
差异应该超过30*24*60*60*10^7.

微软建议

  • 将 SYSTEMTIME 结构转换为 FILETIME 结构(64 位值,表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数)
  • 将结果复制到ULARGE_INTEGER并在此基础上执行正态整数运算

有用的可能是:

  • 系统时间到文件时间(...)