将FILETIME转换为便携式时间单位

时间:2014-07-22 03:28:29

标签: c++ windows unix porting

如何将Windows FILETIME对象转换为time_t或原始秒/毫秒?我正在将一些代码从Windows移植到Unix,所以我不能依赖Windows API函数。

1 个答案:

答案 0 :(得分:6)

FILETIME定义为

  

包含一个64位值,表示自1601年1月1日(UTC)以来100纳秒间隔的数量。

因此,要将其转换为Unix时间,只需减去两个纪元时间并从100纳秒间隔转换为秒/毫秒。任何数量的工具/网站都会告诉您这两个时代相差134774天(或11644473600秒)。因此:

void convert_filetime(struct timeval *out_tv, const FILETIME *filetime)
{
    // Microseconds between 1601-01-01 00:00:00 UTC and 1970-01-01 00:00:00 UTC
    static const uint64_t EPOCH_DIFFERENCE_MICROS = 11644473600000000ull;

    // First convert 100-ns intervals to microseconds, then adjust for the
    // epoch difference
    uint64_t total_us = (((uint64_t)filetime->dwHighDateTime << 32) | (uint64_t)filetime->dwLowDateTime) / 10;
    total_us -= EPOCH_DIFFERENCE_MICROS;

    // Convert to (seconds, microseconds)
    out_tv->tv_sec = (time_t)(total_us / 1000000);
    out_tv->tv_usec = (useconds_t)(total_us % 1000000);
}