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

使用std::get_time设置tm日期失败,输入流错误原因排查

排查std::get_time解析日期失败的问题

嘿,我来帮你拆解这个问题——你的第二个代码块里用std::get_time解析单数字日期"2"时直接失败,本质是德语区域设置(de_DE)对%d格式符的要求和你输入的格式不匹配。

问题原因拆解

  • 对于std::get_time的%d格式说明符,在de_DE locale下,它强制要求输入是两位数字的日份(比如"02"而非"2")。当你输入单个数字"2"时,输入流无法匹配两位数字的格式规则,直接触发解析错误,导致流进入失败状态,tm结构体的tm_mday字段也会保持初始化的0值。
  • 反观第一个代码块能成功运行,是因为你输入的"01:02:03"正好符合%H:%M:%S在de_DE下的两位数字格式要求,所以解析过程完全顺畅。

两种可行解决方案

方案1:修改输入为两位数字

把输入字符串改成带前导零的两位数字,匹配%d的格式要求:

{ // 修改输入为两位数字后正常工作
std::tm t{};
std::istringstream ss("02");
ss.imbue(std::locale("de_DE"));
ss >> std::get_time(&t, "%d");
std::cout << ss.fail() << std::endl;
std::cout << std::put_time(&t, "%c") << '\n';
}

方案2:使用支持单数字日的格式符%e

如果你想兼容单数字的日份输入,可以改用%e格式说明符,它允许日份是1-31的数字,单数字时无需前导零也能正常解析:

{ // 使用%e格式符支持单数字日
std::tm t{};
std::istringstream ss("2");
ss.imbue(std::locale("de_DE"));
ss >> std::get_time(&t, "%e");
std::cout << ss.fail() << std::endl;
std::cout << std::put_time(&t, "%c") << '\n';
}

验证结果

两种方案运行后,都会输出0(表示输入流未失败),并且tm结构体的tm_mday会被正确设置为2,最终输出的日期会显示为:Sun Jan 2 00:00:00 1900。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:52:46