0

Microsoft 在其支持文章中提供了以下功能:

   // 注意:这个函数是不正确的!
   void UnixTimeToFileTime(time_t t, LPFILETIME pft)
   {
     // 注意 LONGLONG 是一个 64 位的值
     龙龙ll;
     ll = Int32x32To64(t, 10000000) + 116444736000000000;
     pft->dwLowDateTime = (DWORD)ll;
     pft->dwHighDateTime = ll >> 32;
   }

但是,如果 Unix 时间“t”指的是 2038 年之后的日期,则此函数会产生不正确的结果。2038年后如何让它正常工作?

4

1 回答 1

1

问题在于 Int32x32To64 函数的使用,因为它将每个参数截断为 32 位。如果 unix 时间超过 32 位(就像 2038 年之后的日期那样),则会产生错误的结果。要更正此问题,请使用 64 位乘法而不是 Int32x32To64 函数:

   void UnixTimeToFileTime(time_t t, LPFILETIME pft)
   {
     // 注意 LONGLONG 是一个 64 位的值
     龙龙ll;
     ll = t * 10000000I64 + 116444736000000000I64;
     pft->dwLowDateTime = (DWORD)ll;
     pft->dwHighDateTime = ll >> 32;
   }

希望这可以节省时间。

于 2018-08-14T21:12:26.320 回答