SYSTEMTIME的30天差异

All*_*ang 0 c++ time date systemtime

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

谢谢

Mat*_*lia 7

正如MSDN页面SYSTEMTIME所说,

建议您不要在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)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

(SystemTimeToFileTime为简洁而省略调用的错误处理)

关于(30*24*60*60)*(ULONGLONG)10000000:30*24*60*60是30天内的秒数; 10000000FILETIME秒中"滴答" 的数量(每个FILETIME滴答是100 ns = 10 ^ 2*10 ^ -9 s = 10 ^ -7 s).对乘法中的一个操作数的强制转换是为了避免溢出常规ints(在执行符合范围的整数文字之间的操作时的默认值int).


GSe*_*erg 6

我会把它们转换成FileTime另一个.
差异应该大于30*24*60*60*10^7.

  • 在基于 C 的语言中使用 ^ 时我会非常小心,因为它是逻辑异或,而不是指数运算! (2认同)