我有一段代码尝试从字符串格式创建一个boost :: gregorian :: date对象,但我最终获得了boost:gregorian :: not_a_date_time,即使字符串看起来很好。 我的代码如下所示:
boost::gregorian::date getDateFromString(std::string date_str, std::string format) const
{
const std::locale loc = std::locale(std::locale::classic(), new boost::gregorian::date_facet(format.c_str()));
std::istringstream is(date_str) ;
is.imbue(loc);
boost::gregorian::date d;
is >> d;
return d;
}
为了测试这个我打电话
boost::gregorian::date d = getDateFromString("20161101","%Y%m%d") ;
我收到了not_a_date_time; 相反,如果我执行以下操作:
boost::gregorian::date d2 = boost::gregorian::date_from_iso_string( "20161101");
我收到了一个合适的约会对象。 我需要一个可以采用各种日期格式的通用函数。我在这里做错了什么?
答案 0 :(得分:2)
您使用date_facet
代替date_input_facet
:
#include <boost/date_time.hpp>
#include <boost/date_time/gregorian/gregorian_io.hpp>
boost::gregorian::date getDateFromString(std::string date_str, std::string format)
{
const std::locale loc = std::locale(std::locale(), new boost::gregorian::date_input_facet(format.c_str()));
std::istringstream is(date_str);
is.imbue(loc);
boost::gregorian::date d;
is.exceptions(~std::ios::iostate::_S_goodbit);
is >> d;
return d;
}
int main() {
boost::gregorian::date d = getDateFromString("20161101","%Y%m%d");
std::cout << d;
}
注意使用exceptions()
查看解析器无法解析时认为错误的内容。除非您也处理异常,否则您可能不希望启用它。
<强> Live On Coliru 强>
打印
2016-Nov-01