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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:57:10