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; }
关键逻辑说明
- 转换为system_clock时间点:直接用
microseconds构造system_clock::time_point,因为system_clock的纪元就是UTC纪元。 - 计算时间差:通过
sys_target - sys_now得到目标时间与当前系统时间的偏移量,这个偏移量是duration类型,不属于任何特定时钟,可以安全地应用到其他时钟的时间点上。 - 映射到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
相关产品推荐
相关产品推荐

