如何使用boost :: date_time解析周年?

时间:2011-10-31 23:02:02

标签: c++ datetime boost boost-date-time

我想解析由4位数年份和一年中的周数组成的字符串。我已经按照提升日期/时间IO教程,生成了一个这样的测试示例:

std::string week_format = "%Y-W%W";
boost::date_time::date_input_facet<boost::gregorian::date, char> week_facet =     boost::date_time::date_input_facet<boost::gregorian::date, char>(week_format);

std::stringstream input_ss;
input_ss.imbue(locale(input_ss.getloc(), &week_facet));

std::string input_week = "2004-W34";
input_ss.str(input_week);

boost::gregorian::date input_date;
input_ss >> input_date;

不幸的是,input_date只打印为“2004-01-01”,暗示它只是解析了一年。我究竟做错了什么?输入时%W不可用吗? (文档没有将其标记为。)

1 个答案:

答案 0 :(得分:1)

你是正确的,文档没有在“格式标志”部分中标记它(旁边没有“!”)。

http://www.boost.org/doc/libs/1_35_0/doc/html/date_time/date_time_io.html#date_time.format_flags

但这似乎是一种疏忽。因为在Boost的format_date_parser.hpp中,parse_date中没有对此案例进行报道...您可以查看switch语句并查看:

http://svn.boost.org/svn/boost/trunk/boost/date_time/format_date_parser.hpp

尽管没有任何代码可以执行,但即使源代码中的注释表明它在解析输入上处理%W和%U。那是怎么回事? : - /

另一方面,我认为在你的例子中需要动态分配week_facet:

std::string week_format = "%Y-W%W";
boost::date_time::date_input_facet<boost::gregorian::date, char>* week_facet =
    new boost::date_time::date_input_facet<boost::gregorian::date, char>(
        week_format
    );

std::stringstream input_ss;
input_ss.imbue(std::locale(input_ss.getloc(), week_facet));

(或者至少我必须这样做以防止示例崩溃。)