2011-10-31 65 views
2

我想解析一个由4位年份和一年内的星期编号组成的字符串。我已经按照升压日期/时间IO教程,制作这样一个测试例子:如何使用boost :: date_time解析每周数据?

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

如果文档没有将其标记为“格式标志”部分(旁边有否“!”),那么这是正确的。)

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)); 

(或者至少我不得不那样做,以保持崩溃的例子。)

+0

啊,我只是在调用语言环境时做了取消引用。但是你的表单更接近文档中的例子。我猜他们在评论中列出了功能,然后从未执行过。 – UltraNurd

+0

术语说明:当你使用'&'你是“接收地址”,并且当你使用'*'时,你正在执行一个解除引用。与在栈上声明某个东西并传递地址(与使用动态分配)相比,一个很大的区别是当你传递指针的人期望他们可以“删除”它......这似乎是其中的一种情况。 – HostileFork

相关问题