【发布时间】:2012-06-14 23:46:06
【问题描述】:
我愿意问是否有人有一些好的算法(或方法)来检查两个 SYSTEMTIME 变量是否有 30 天或更长时间的差异?
谢谢
【问题讨论】:
-
我可能会将两者都转换为 FILETIME 并以这种方式进行比较。您将使用 SystemTimeToFileTime 函数来执行此操作,然后进行数学运算。
标签: c++ date time systemtime
我愿意问是否有人有一些好的算法(或方法)来检查两个 SYSTEMTIME 变量是否有 30 天或更长时间的差异?
谢谢
【问题讨论】:
标签: c++ date time systemtime
正如SYSTEMTIME 上的MSDN page 所说,
不建议您从
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)10000000:30*24*60*60是30天的秒数; 10000000 是一秒钟内FILETIME“滴答”的数量(每个FILETIME 滴答为100 ns=10^2*10^-9 s=10^-7 s)。转换为乘法中的操作数之一是为了避免溢出常规 ints(在适合 int 范围的整数文字之间执行操作时的默认值)。
【讨论】:
我会 convert them to FileTime 并从另一个中减去。
差值应该大于30*24*60*60*10^7。
【讨论】:
30*24*60*60*10^7 号码吗?只是想确保没有人对此有任何错误。
FileTime 具有 100 纳秒的分辨率,您可以通过单击链接找到。
微软advises到
有用的可能是:
【讨论】: