Как мне анализировать недели в году с boost::date_time?
Я хочу проанализировать строки, которые состоят из 4-значного года и номера недели в году. Я следовал обучающему руководству по вводу-выводу даты / времени, создав такой пример теста:
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
Но это похоже на недосмотр. Потому что в бусте 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));
(Или, по крайней мере, я должен был сделать это таким образом, чтобы избежать сбоя примера.)