【问题标题】:30 days Difference on SYSTEMTIME30 天 SYSTEMTIME 差异
【发布时间】:2012-06-14 23:46:06
【问题描述】:

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

谢谢

【问题讨论】:

  • 我可能会将两者都转换为 FILETIME 并以这种方式进行比较。您将使用 SystemTimeToFileTime 函数来执行此操作,然后进行数学运算。

标签: c++ date time systemtime


【解决方案1】:

正如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)1000000030*24*60*60是30天的秒数; 10000000 是一秒钟内FILETIME“滴答”的数量(每个FILETIME 滴答为100 ns=10^2*10^-9 s=10^-7 s)。转换为乘法中的操作数之一是为了避免溢出常规 ints(在适合 int 范围的整数文字之间执行操作时的默认值)。

【讨论】:

    【解决方案2】:

    我会 convert them to FileTime 并从另一个中减去。
    差值应该大于30*24*60*60*10^7

    【讨论】:

    • 谢谢,但请您花点时间解释一下30*24*60*60*10^7 号码吗?只是想确保没有人对此有任何错误。
    • @AllanJiang 这是 30 天内 100 纳秒间隔的数量。 FileTime 具有 100 纳秒的分辨率,您可以通过单击链接找到。
    • 我会非常小心在基于 C 的语言中使用 ^,因为它是逻辑异或,而不是指数运算!
    • 忽略闰秒。
    【解决方案3】:

    微软advises

    有用的可能是:

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多