从字符串创建提升日期的问题

时间:2016-11-10 15:14:13

标签: c++ datetime boost

我有一段代码尝试从字符串格式创建一个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");

我收到了一个合适的约会对象。 我需要一个可以采用各种日期格式的通用函数。我在这里做错了什么?

1 个答案:

答案 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