Visual Studio 2022中C++ last_write_time返回超大值的转换问题
解决Windows下C++20获取文件修改时间戳的错误问题
问题根源在于Windows与Unix类系统的时间纪元差异:
- macOS等Unix类系统的时间纪元是1970年1月1日00:00:00 UTC
- Windows文件时间的纪元是1601年1月1日00:00:00 UTC
直接转换std::filesystem::last_write_time返回的时间点,得到的是自1601年以来的秒数,自然会远大于正常Unix时间戳,表现为"未来时间"。
修正方案
计算两个纪元的固定时间差(1601-01-01到1970-01-01共11644473600秒),用Windows文件时间的秒数减去该差值,即可得到标准Unix时间戳。
修正后的完整代码:
#include <iostream> #include <filesystem> #include <chrono> int main() { std::string fileName = "test.txt"; auto modTime = std::filesystem::last_write_time(std::filesystem::path(fileName)); // 转换为自Windows纪元以来的秒数 auto sinceWinEpoch = std::chrono::duration_cast<std::chrono::seconds>(modTime.time_since_epoch()); // Windows纪元到Unix纪元的固定偏移秒数 const std::chrono::seconds unixEpochOffset{11644473600}; // 计算标准Unix时间戳 auto unixTimestamp = (sinceWinEpoch - unixEpochOffset).count(); std::cout << "Got Modified Time (Unix timestamp): " << unixTimestamp << std::endl; return 0; }
验证说明
你之前得到的错误值13314844775,减去11644473600后得到1670371175,该值对应2022年12月左右,符合"昨日修改文件"的预期。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

