Как я могу использовать 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
флаг формата, соответствующий желаемому поведению, но его можно использовать только для вывода, а не для ввода, и даже только на ограниченном наборе платформ.