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

C++17无clock_cast时std::filesystem时钟逆向转换实现求助

解决std::filesystem::file_time_type与UTC微秒数的逆向转换问题

错误原因分析

你遇到的编译错误是因为不同时钟类型的time_point不能直接进行算术运算:sys_now是system_clock的时间点,fil_now是file_clock的时间点,两者属于不同的时钟体系,C++标准不允许直接相加或相减。

正确的逆向转换实现

基于你正向转换的逻辑,逆向转换需要先将UTC微秒数转换为system_clock的时间点,再通过两个时钟的当前时间差映射到file_clock的时间点:

std::filesystem::file_time_type fromUSsecSinceEpochUTC(int64_t usec_utc) {
    using namespace std::chrono;

    // 将UTC微秒数转换为system_clock的时间点
    system_clock::time_point sys_target{microseconds{usec_utc}};
    
    // 获取两个时钟的当前时间点
    auto sys_now = system_clock::now();
    auto fil_now = std::filesystem::file_time_type::clock::now();

    // 计算目标system时间与当前system时间的差值,映射到file_clock时间轴
    auto delta = sys_target - sys_now;
    auto fil_target = time_point_cast<std::filesystem::file_time_type::duration>(fil_now + delta);
    
    return fil_target;
}

关键逻辑说明

  1. 转换为system_clock时间点:直接用microseconds构造system_clock::time_point,因为system_clock的纪元就是UTC纪元。
  2. 计算时间差:通过sys_target - sys_now得到目标时间与当前系统时间的偏移量,这个偏移量是duration类型,不属于任何特定时钟,可以安全地应用到其他时钟的时间点上。
  3. 映射到file_clock:将偏移量加到fil_now上,再用time_point_cast转换为file_time_type的精度,确保类型匹配。

MSVC2019兼容性说明

MSVC2019对C++20的std::chrono::file_clock支持有限,若遇到额外编译问题,可以尝试显式指定时钟类型:

using file_clock = std::filesystem::file_time_type::clock;
auto fil_now = file_clock::now();
auto fil_target = time_point_cast<file_clock::duration>(fil_now + delta);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:05:29