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

VS2019最新社区版中从date.h迁移至C++20 chrono库后parse函数报错问题求助

解决C++20 chrono库parse函数匹配错误的问题

嘿,这个问题我之前迁移代码的时候也碰到过!其实就是C++20标准库的std::chrono::parse和你之前用的date.h版本有个容易忽略的小差异,导致了重载匹配失败。

错误的核心原因

C++20的std::chrono::parse对格式参数的要求和date.h不一样:

  • date.h的parse可以直接接收字符串字面量,但C++20标准里的parse要求第一个参数是std::string_view类型(或者符合std::format_string要求的编译期常量),直接传"%Y-%m-%d %H:%M:%S"这种字符串字面量会因为类型不匹配找不到合适的重载。
  • 另外你漏了一个关键头文件:<sstream>!之前date.h可能间接帮你包含了它,但C++20的chrono库不会自动引入这个头,缺少它的话虽然不一定直接报这个错,但也是潜在问题。

修正后的代码

把你的C++20版本代码改成这样就可以正常运行了:

#include <chrono>
#include <sstream>  // 必须显式包含,处理istringstream
#include <string>
#include <string_view>  // 如果用""sv字面量的话需要这个

auto StringToUnix(const std::string& source) -> std::time_t {
    using namespace std::chrono;
    std::istringstream in(source);
    sys_seconds tp{};
    // 两种传递格式字符串的方式选一种就行
    // 方式1:显式转为string_view
    in >> parse(std::string_view{"%Y-%m-%d %H:%M:%S"}, tp);
    // 方式2:用string_view字面量(需要包含<string_view>)
    // in >> parse("%Y-%m-%d %H:%M:%S"sv, tp);
    return system_clock::to_time_t(tp);
}

额外注意事项

  • 确保你的VS2019项目已经开启C20标准:右键项目 → 属性 → C/C → 语言 → C标准,选择ISO C++20标准(/std:c++20),VS2019的早期版本对C20的chrono支持可能不全,建议升级到最新的社区版补丁。
  • 格式语法和date.h基本兼容,你的%Y-%m-%d %H:%M:%S格式完全可以正常使用,不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:43:11