Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::gregorian解析C+中的两位数年份+;?_C++_Parsing_Date_Boost_Boost Date Time - Fatal编程技术网

C++ 如何使用boost::gregorian解析C+中的两位数年份+;?

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格式标志匹配您想要的行为,但它只能用

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

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


一种可能是对日期字符串进行一些预处理,并结合编程规则添加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将始终为真,但我明白了这个想法:-)