我需要使用2012-12-21 12:10:35
将日期时间字符串time_t
解析为boost::spirit
值。这是我的代码片段:
tc_ = lexeme[int_[phx::ref(tm_.tm_year)=(_1-1900)]>>'-'
>>int_[phx::ref(tm_.tm_mon)=(_1-1)]>>'-'
>>int_[phx::ref(tm_.tm_mday)=_1]>>+space
>>int_[phx::ref(tm_.tm_hour)=_1]>>':'
>>int_[phx::ref(tm_.tm_min)=_1]>>':'
>>int_[phx::ref(tm_.tm_sec)=_1]] [_val = (long)mktime(&tm_)];
其中tc_
是qi
类型的规则:qi::rule<Iterator, long(), Skipper>
,tm_
是struct tm
类型的成员变量。
代码编译,但不起作用。似乎mktime()
根本没有被调用。我做错了什么?
答案 0 :(得分:0)
你可以在c ++ 11 vi中使用正则表达式。 如果您的编译器足够新,那么这将是可移植的和标准的。
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
std::regex txt_regex("([0-9]{4})[-]([0-9]{2})[-]([0-9]{2})[ ]([0-9]{2})([:])([0-9]{2})([:])([0-9]{2})");//
string strTmp;
strTmp="2010-12-15 15:25:46";
std::smatch match;
std::regex_search( strTmp, match, txt_regex );
if(regex_match(strTmp,txt_regex))
cout<<"Ok"<<endl;
else
{
cout<<"Invalid input"<<endl;
return 0;
}
if ( match.empty() )
{
std::cout << "...no more matches" << std::endl;
return 0;
}
for ( auto x : match )
{
std::cout << "found: " << x << std::endl;
}
string str = match.suffix().str();
cout <<str <<std::endl;
return 0;
}
使用此功能,您可以显示要显示的字符串的不同部分,然后填充结构。
希望它有所帮助并像往常一样公开评论(如果某些事情不明确或不完整)。