0

Boost 中的 boost::gregorian::from_*string() 解析函数似乎只处理 4 位数年份(导致 2 位数年份的运行时错误)。

使用 boost::gregorian::from_*string() 函数处理 2 位数年份的最简洁方法是什么?

一种可能性是结合编程规则对日期字符串进行一些预处理,以添加 2000 或 1900 以清理日期格式,但如果有更好的方法,我不想重新发明轮子并添加太多代码做这个。

4

2 回答 2

0

Boost.DateTime 不能做到这一点——文档说有一个%C格式标志可以匹配你想要的行为,但它只能用于输出,不能用于输入,即使这样也只能在有限的平台上使用。

于 2012-05-25T21:14:33.943 回答
0

boost 中似乎不支持这种格式。幸运的是,解析日期格式是单行的。下面是一个用 AXE 编写的解析器,我相信你可以在 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.
}
于 2012-05-29T19:00:40.037 回答