Как я могу использовать boost::gregorian для анализа двухзначных лет в C++?

Функции синтаксического анализа boost::gregorian::from_*string() в Boost, похоже, обрабатывают только 4-значные годы (вызывая ошибку времени выполнения для 2-значных лет).

Какой самый простой способ использовать функции boost::gregorian::from_*string() для обработки двухзначных лет?

Одна возможность состоит в том, чтобы сделать некоторую предварительную обработку строк даты в сочетании с правилами программирования для добавления 2000 или 1900 для очистки формата даты, но я не хочу изобретать колесо и добавлять слишком много кода, если есть лучший способ сделай это.

2 ответа

Решение

Не похоже, что этот формат поддерживается в boost. К счастью, формат даты синтаксического анализа является однострочным. Ниже представлен синтаксический анализатор, написанный на AX, и я уверен, что вы можете написать подобный код на Spirit.

using namespace boost::gregorian;
using namespace axe::shortcuts;
unsigned year, month, day;
auto date_rule = _uint >> year > '/' > _uint >> month > '/' > _uint >> day > _z;
std::string date_string("99/01/22");
if(date_rule(date_string.begin(), date_string.end()).matched)
{
   date d(year < 100 ? year + 1900 : year, month, day);
   // etc.
}

Boost.DateTime не может этого сделать - документы говорят, что есть %C флаг формата, соответствующий желаемому поведению, но его можно использовать только для вывода, а не для ввода, и даже только на ограниченном наборе платформ.

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