我有一段代码尝试从字符串格式创建 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");
我收到了正确的日期对象。 我需要一个可以采用多种日期格式的通用函数。我在这里做错了什么?
最佳答案
您正在使用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()
来查看解析器在解析失败时认为错误的地方。您可能不想启用它,除非您也处理异常。
打印
2016-Nov-01
关于c++ - 从字符串创建 boost 日期时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40530954/