C++11中std::get_time()无法使用%F格式符的问题排查
关于C++11中std::get_time()无法使用%F格式说明符的问题解答
嘿,这个问题我之前也碰到过!你的理解其实没毛病,问题出在老版本编译器的实现上,不是C++11标准本身的锅。
先明确标准层面的支持情况
你说得完全正确:
%F是C99标准给strftime()引入的格式说明符,本质是%Y-%m-%d的缩写;- C++11标准明确规定
std::get_time()会遵循strftime()的格式规则,所以从标准角度来说,%F是完全合法的。
为什么clang 3.8.0和gcc 5.4.0会失败?
早期的GCC和Clang版本在实现std::get_time()时,并没有完全兼容所有C99的strftime格式符,尤其是这类缩写格式。这属于老版本编译器的实现缺陷——它们的std::get_time()实现没有跟上标准要求,漏掉了对%F这类格式的支持。
后续的编译器版本(比如GCC 6+、Clang 4.0+)都修复了这个问题,能正常识别%F。
解决方案
有两个可行的办法:
- 替换格式符:直接把
%F写成等效的%Y-%m-%d,这是最稳妥的兼容方案,在所有支持C++11的编译器里都能正常工作。
比如把你的代码里的格式字符串改成:ss >> std::get_time(&tm, "%Y-%m-%d"); - 升级编译器:如果项目允许的话,把GCC升级到6.x及以上版本,或者Clang升级到4.0及以上版本,就能直接使用
%F格式符了。
附上你的代码示例(修正后)
#include <cstdio> // printf() #include <ctime> // std::tm #include <cstring> // memcpy() #include <sstream> #include <iomanip> // std::get_time int main() { std::tm tm{}; std::istringstream ss("2024-05-20"); // 用%Y-%m-%d替代%F,兼容老编译器 ss >> std::get_time(&tm, "%Y-%m-%d"); if (ss.fail()) { printf("Parsing failed!\n"); } else { printf("Year: %d, Month: %d, Day: %d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); } return 0; }
内容的提问来源于stack exchange,提问作者villapx
相关产品推荐
相关产品推荐

