如何正确地将Unix时间转换为Win32使用的FILETIME

时间:2018-08-14 21:12:26

标签: unix-timestamp filetime

Microsoft在其support article中提供以下功能:

   // NOTE: this function is INCORRECT!
   void UnixTimeToFileTime(time_t t, LPFILETIME pft)
   {
     // Note that LONGLONG is a 64-bit value
     LONGLONG ll;
     ll = Int32x32To64(t, 10000000) + 116444736000000000;
     pft->dwLowDateTime = (DWORD)ll;
     pft->dwHighDateTime = ll >> 32;
   }

但是,如果Unix时间“ t”是指2038年之后的日期,则此函数将产生错误的结果。在2038年后如何使其正常工作?

1 个答案:

答案 0 :(得分:0)

问题在于Int32x32To64函数的使用,因为它会将其参数分别截断为32位。如果Unix时间超过32位(发生在2038年之后的日期),则会产生错误的结果。要解决此问题,请使用64位乘法而不是Int32x32To64函数:

   void UnixTimeToFileTime(time_t t, LPFILETIME pft)
   {
     // Note that LONGLONG is a 64-bit value
     LONGLONG ll;
     ll = t * 10000000I64 + 116444736000000000I64;
     pft->dwLowDateTime = (DWORD)ll;
     pft->dwHighDateTime = ll >> 32;
   }

希望这可以节省时间。