C++ 如何使用boost::gregorian解析C+中的两位数年份+;?
boost中的boost::gregorian::from_*string()解析函数似乎只处理4位数的年份(导致运行时出现2位数的年份错误) 使用boost::gregorian::from_*string()函数处理2位数年份的最干净方法是什么C++ 如何使用boost::gregorian解析C+中的两位数年份+;?,c++,parsing,date,boost,boost-date-time,C++,Parsing,Date,Boost,Boost Date Time,boost中的boost::gregorian::from_*string()解析函数似乎只处理4位数的年份(导致运行时出现2位数的年份错误) 使用boost::gregorian::from_*string()函数处理2位数年份的最干净方法是什么 一种可能是对日期字符串进行一些预处理,并结合编程规则添加2000或1900以净化日期格式,但是,如果有更好的方法,我不想重新发明轮子,添加太多的代码。Boost.DateTime无法做到这一点——比如说,有一个%C格式标志匹配您想要的行为,但它只能用
一种可能是对日期字符串进行一些预处理,并结合编程规则添加2000或1900以净化日期格式,但是,如果有更好的方法,我不想重新发明轮子,添加太多的代码。Boost.DateTime无法做到这一点——比如说,有一个
%C
格式标志匹配您想要的行为,但它只能用于输出,不能用于输入,即使这样,也只能在有限的平台上使用。boost似乎不支持这种格式。幸运的是,解析日期格式是一行程序。下面是用AXE编写的解析器,我相信您可以编写类似的精神代码
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::gregorian;
使用名称空间axe::快捷方式;
未签名的年、月、日;
自动日期规则=\u uint>>年>'/'>\u uint>>月>'/'>\u uint>>日>\u z;
标准:字符串日期字符串(“99/01/22”);
if(日期规则(日期字符串.begin(),日期字符串.end()).matched)
{
日期d(年<100年+1900年:年、月、日);
//等等。
}
heh,如果年份是两位数,那么年份<100将始终为真,但我明白了这个想法:-)