使用std::get_time设置tm日期失败,输入流错误原因排查
排查std::get_time解析日期失败的问题
嘿,我来帮你拆解这个问题——你的第二个代码块里用std::get_time解析单数字日期"2"时直接失败,本质是德语区域设置(de_DE)对%d格式符的要求和你输入的格式不匹配。
问题原因拆解
- 对于
std::get_time的%d格式说明符,在de_DElocale下,它强制要求输入是两位数字的日份(比如"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
相关产品推荐
相关产品推荐

