Microsoft在其支持文章(https://support.microsoft.com/en-us/help/167296/how-to-convert-a-unix-time-t-to-a-win32-filetime-or-systemtime)中提供以下函数:
// 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年之后正常运作?
发布于 2018-08-15 15:23:07
问题是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;
}
https://stackoverflow.com/questions/-100008795
复制相似问题