Boost 中的 boost::gregorian::from_*string() 解析函数似乎只处理 4 位数的年份(导致 2 位数年份的运行时错误)。
使用 boost::gregorian::from_*string() 函数处理 2 位数年份的最干净方法是什么?
一种可能性是结合添加 2000 或 1900 的编程规则对日期字符串进行一些预处理以清理日期格式,但我不想重新发明轮子并添加太多代码如果有更好的方法可以做到这一点。
看起来 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.
}
Boost.DateTime 无法做到这一点——文档说有一个与你想要的行为相匹配的%C
格式标志,但它只能用于输出,不能用于输入,即使这样也只能在有限的平台上使用。