Как мне анализировать недели в году с 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));

(Или, по крайней мере, я должен был сделать это таким образом, чтобы избежать сбоя примера.)

Другие вопросы по тегам