You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++17中将std::filesystem::file_time_type转换为FILETIME?

C17/C11 转换 std::filesystem::file_time_type 到 FILETIME

C++17 原生实现

std::filesystem::file_time_type 基于 Unix 纪元(1970年1月1日),而 FILETIME 以1601年1月1日为起点,单位是100纳秒。转换核心是计算两个纪元的时间差,再将文件时间偏移到FILETIME的时间轴上:

#include <filesystem>
#include <chrono>
#include <cstdint>
#include <windows.h>

FILETIME file_time_to_FILETIME(const std::filesystem::file_time_type& file_time)
{
    // 1601年1月1日到1970年1月1日的100纳秒间隔总数
    constexpr uint64_t epoch_offset = 11644473600ULL * 10000000ULL;

    // 将文件时间转换为100纳秒为单位的计数(相对于Unix纪元)
    auto time_since_unix_epoch = file_time.time_since_epoch();
    uint64_t file_time_100ns = std::chrono::duration_cast<
        std::chrono::duration<uint64_t, std::ratio<1, 10000000>>
    >(time_since_unix_epoch).count();

    // 计算FILETIME对应的总100纳秒数
    uint64_t total_100ns = epoch_offset + file_time_100ns;

    // 拆分64位值到FILETIME的两个32位字段
    FILETIME ft{};
    ft.dwLowDateTime = static_cast<DWORD>(total_100ns);
    ft.dwHighDateTime = static_cast<DWORD>(total_100ns >> 32);
    return ft;
}

C++11 兼容方案

C++11 没有原生的 std::filesystem,通常使用 boost::filesystem 替代。以下是基于 boost::posix_time::ptime 的转换实现:

#include <boost/filesystem.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <cstdint>
#include <windows.h>

FILETIME boost_file_time_to_FILETIME(const boost::posix_time::ptime& file_time)
{
    constexpr uint64_t epoch_offset = 11644473600ULL * 10000000ULL;

    // 计算文件时间与Unix纪元的时间差
    const auto unix_epoch = boost::posix_time::from_time_t(0);
    auto time_diff = file_time - unix_epoch;

    // 转换为100纳秒单位的计数
    uint64_t total_seconds = time_diff.total_seconds();
    uint64_t fractional_100ns = time_diff.fractional_seconds() * 100; // 微秒转100纳秒
    uint64_t file_time_100ns = total_seconds * 10000000ULL + fractional_100ns;

    uint64_t total_100ns = epoch_offset + file_time_100ns;

    FILETIME ft{};
    ft.dwLowDateTime = static_cast<DWORD>(total_100ns);
    ft.dwHighDateTime = static_cast<DWORD>(total_100ns >> 32);
    return ft;
}

关键说明

  • 两种转换均基于UTC时间,无需额外时区转换
  • 使用 uint64_t 避免溢出问题,确保覆盖现代文件时间范围
  • C++17实现依赖<filesystem>头文件,编译时可能需要链接对应库(如MSVC需/std:c++17并链接filesystem.lib)

内容的提问来源于stack exchange,提问作者Lion Butcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:28:26