我想将ANSI C'格式的字符串转换为std::tm
对象。
实施例
Sun Nov 6 08:49:37 1994; ANSI C的asctime()格式
此处有更多信息here。
#include <string>
#include <ctime>
#include <iomanip>
#include <locale>
bool parseAscTimeDate(std::tm& tm, const std::string& str) {
std::istringstream ss(str);
//ss.imbue(std::locale("en_US.UTF8")); //try timezone?
ss >> std::get_time(&tm, "%a %b %d %H:%M:%S %Y");
return !ss.fail();
}
那为什么会失败?
/* ANSI C's asctime format */
std::tm tm;
if (parseAscTimeDate(tm, "Sun Nov 6 08:49:37 1994"))
std::cout << "Ok!" << std::endl;
else
std::cout << "Wrong!" << std::endl;
strptime
,因为musl libc中存在错误。 无需设置tzname,timezone和daylight。
来自here
答案 0 :(得分:5)
看起来%d
格式要求每月的两位数字,与std::get_time
上的描述相反:
d :将月中的日期解析为十进制数(范围[01,31]),允许但不是必需的前导零。
这是GNU C ++标准库中报告的错误:set::get_time() requires leading 0s for %H and friends。